mirror of
				https://github.com/MHSanaei/3x-ui.git
				synced 2025-10-30 20:02:51 +00:00 
			
		
		
		
	Compare commits
	
		
			No commits in common. "88ac815c4a330d92803e31d71eae3d89e0d74cab" and "e24d672a36b55b8bef775a23b77f0adbfb9f6190" have entirely different histories.
		
	
	
		
			88ac815c4a
			...
			e24d672a36
		
	
		
					 37 changed files with 268 additions and 350 deletions
				
			
		
							
								
								
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -100,7 +100,7 @@ jobs: | ||||||
|           cd x-ui/bin |           cd x-ui/bin | ||||||
|            |            | ||||||
|           # Download dependencies |           # Download dependencies | ||||||
|           Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.8.3/" |           Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.6.8/" | ||||||
|           if [ "${{ matrix.platform }}" == "amd64" ]; then |           if [ "${{ matrix.platform }}" == "amd64" ]; then | ||||||
|             wget -q ${Xray_URL}Xray-linux-64.zip |             wget -q ${Xray_URL}Xray-linux-64.zip | ||||||
|             unzip Xray-linux-64.zip |             unzip Xray-linux-64.zip | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ case $1 in | ||||||
| esac | esac | ||||||
| mkdir -p build/bin | mkdir -p build/bin | ||||||
| cd build/bin | cd build/bin | ||||||
| wget -q "https://github.com/XTLS/Xray-core/releases/download/v25.8.3/Xray-linux-${ARCH}.zip" | wget -q "https://github.com/XTLS/Xray-core/releases/download/v25.6.8/Xray-linux-${ARCH}.zip" | ||||||
| unzip "Xray-linux-${ARCH}.zip" | unzip "Xray-linux-${ARCH}.zip" | ||||||
| rm -f "Xray-linux-${ARCH}.zip" geoip.dat geosite.dat | rm -f "Xray-linux-${ARCH}.zip" geoip.dat geosite.dat | ||||||
| mv xray "xray-linux-${FNAME}" | mv xray "xray-linux-${FNAME}" | ||||||
|  |  | ||||||
|  | @ -1 +1 @@ | ||||||
| 2.6.3 | 2.6.1 | ||||||
							
								
								
									
										50
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								go.mod
									
									
									
									
									
								
							|  | @ -1,6 +1,6 @@ | ||||||
| module x-ui | module x-ui | ||||||
| 
 | 
 | ||||||
| go 1.24.5 | go 1.24.4 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/gin-contrib/gzip v1.2.3 | 	github.com/gin-contrib/gzip v1.2.3 | ||||||
|  | @ -14,22 +14,22 @@ require ( | ||||||
| 	github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 | 	github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 | ||||||
| 	github.com/pelletier/go-toml/v2 v2.2.4 | 	github.com/pelletier/go-toml/v2 v2.2.4 | ||||||
| 	github.com/robfig/cron/v3 v3.0.1 | 	github.com/robfig/cron/v3 v3.0.1 | ||||||
| 	github.com/shirou/gopsutil/v4 v4.25.7 | 	github.com/shirou/gopsutil/v4 v4.25.6 | ||||||
| 	github.com/valyala/fasthttp v1.64.0 | 	github.com/valyala/fasthttp v1.63.0 | ||||||
| 	github.com/xlzd/gotp v0.1.0 | 	github.com/xlzd/gotp v0.1.0 | ||||||
| 	github.com/xtls/xray-core v1.250803.0 | 	github.com/xtls/xray-core v1.250608.0 | ||||||
| 	go.uber.org/atomic v1.11.0 | 	go.uber.org/atomic v1.11.0 | ||||||
| 	golang.org/x/crypto v0.40.0 | 	golang.org/x/crypto v0.39.0 | ||||||
| 	golang.org/x/text v0.27.0 | 	golang.org/x/text v0.26.0 | ||||||
| 	google.golang.org/grpc v1.74.2 | 	google.golang.org/grpc v1.73.0 | ||||||
| 	gorm.io/driver/sqlite v1.6.0 | 	gorm.io/driver/sqlite v1.6.0 | ||||||
| 	gorm.io/gorm v1.30.1 | 	gorm.io/gorm v1.30.0 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/andybalholm/brotli v1.2.0 // indirect | 	github.com/andybalholm/brotli v1.2.0 // indirect | ||||||
| 	github.com/bytedance/sonic v1.14.0 // indirect | 	github.com/bytedance/sonic v1.13.3 // indirect | ||||||
| 	github.com/bytedance/sonic/loader v0.3.0 // indirect | 	github.com/bytedance/sonic/loader v0.2.4 // indirect | ||||||
| 	github.com/cloudflare/circl v1.6.1 // indirect | 	github.com/cloudflare/circl v1.6.1 // indirect | ||||||
| 	github.com/cloudwego/base64x v0.1.5 // indirect | 	github.com/cloudwego/base64x v0.1.5 // indirect | ||||||
| 	github.com/dgryski/go-metro v0.0.0-20250106013310-edb8663e5e33 // indirect | 	github.com/dgryski/go-metro v0.0.0-20250106013310-edb8663e5e33 // indirect | ||||||
|  | @ -41,7 +41,9 @@ require ( | ||||||
| 	github.com/go-playground/locales v0.14.1 // indirect | 	github.com/go-playground/locales v0.14.1 // indirect | ||||||
| 	github.com/go-playground/universal-translator v0.18.1 // indirect | 	github.com/go-playground/universal-translator v0.18.1 // indirect | ||||||
| 	github.com/go-playground/validator/v10 v10.27.0 // indirect | 	github.com/go-playground/validator/v10 v10.27.0 // indirect | ||||||
|  | 	github.com/go-task/slim-sprig/v3 v3.0.0 // indirect | ||||||
| 	github.com/google/btree v1.1.3 // indirect | 	github.com/google/btree v1.1.3 // indirect | ||||||
|  | 	github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 // indirect | ||||||
| 	github.com/gorilla/context v1.1.2 // indirect | 	github.com/gorilla/context v1.1.2 // indirect | ||||||
| 	github.com/gorilla/securecookie v1.1.2 // indirect | 	github.com/gorilla/securecookie v1.1.2 // indirect | ||||||
| 	github.com/gorilla/sessions v1.4.0 // indirect | 	github.com/gorilla/sessions v1.4.0 // indirect | ||||||
|  | @ -52,20 +54,19 @@ require ( | ||||||
| 	github.com/json-iterator/go v1.1.12 // indirect | 	github.com/json-iterator/go v1.1.12 // indirect | ||||||
| 	github.com/juju/ratelimit v1.0.2 // indirect | 	github.com/juju/ratelimit v1.0.2 // indirect | ||||||
| 	github.com/klauspost/compress v1.18.0 // indirect | 	github.com/klauspost/compress v1.18.0 // indirect | ||||||
| 	github.com/klauspost/cpuid/v2 v2.3.0 // indirect | 	github.com/klauspost/cpuid/v2 v2.2.11 // indirect | ||||||
| 	github.com/kr/text v0.2.0 // indirect |  | ||||||
| 	github.com/leodido/go-urn v1.4.0 // indirect | 	github.com/leodido/go-urn v1.4.0 // indirect | ||||||
| 	github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect | 	github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect | ||||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | 	github.com/mattn/go-isatty v0.0.20 // indirect | ||||||
| 	github.com/mattn/go-sqlite3 v1.14.30 // indirect | 	github.com/mattn/go-sqlite3 v1.14.28 // indirect | ||||||
| 	github.com/miekg/dns v1.1.68 // indirect |  | ||||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||||
|  | 	github.com/onsi/ginkgo/v2 v2.23.4 // indirect | ||||||
| 	github.com/pires/go-proxyproto v0.8.1 // indirect | 	github.com/pires/go-proxyproto v0.8.1 // indirect | ||||||
| 	github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect | 	github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect | ||||||
| 	github.com/quic-go/qpack v0.5.1 // indirect | 	github.com/quic-go/qpack v0.5.1 // indirect | ||||||
| 	github.com/quic-go/quic-go v0.54.0 // indirect | 	github.com/quic-go/quic-go v0.52.0 // indirect | ||||||
| 	github.com/refraction-networking/utls v1.8.0 // indirect | 	github.com/refraction-networking/utls v1.7.3 // indirect | ||||||
| 	github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect | 	github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect | ||||||
| 	github.com/rogpeppe/go-internal v1.14.1 // indirect | 	github.com/rogpeppe/go-internal v1.14.1 // indirect | ||||||
| 	github.com/sagernet/sing v0.6.6 // indirect | 	github.com/sagernet/sing v0.6.6 // indirect | ||||||
|  | @ -81,20 +82,21 @@ require ( | ||||||
| 	github.com/valyala/fastjson v1.6.4 // indirect | 	github.com/valyala/fastjson v1.6.4 // indirect | ||||||
| 	github.com/vishvananda/netlink v1.3.1 // indirect | 	github.com/vishvananda/netlink v1.3.1 // indirect | ||||||
| 	github.com/vishvananda/netns v0.0.5 // indirect | 	github.com/vishvananda/netns v0.0.5 // indirect | ||||||
| 	github.com/xtls/reality v0.0.0-20250727231020-de3bb4d08f5a // indirect | 	github.com/xtls/reality v0.0.0-20250627141458-e62c4aed0d57 // indirect | ||||||
| 	github.com/yusufpapurcu/wmi v1.2.4 // indirect | 	github.com/yusufpapurcu/wmi v1.2.4 // indirect | ||||||
|  | 	go.uber.org/automaxprocs v1.6.0 // indirect | ||||||
| 	go.uber.org/mock v0.5.2 // indirect | 	go.uber.org/mock v0.5.2 // indirect | ||||||
| 	go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect | 	go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect | ||||||
| 	golang.org/x/arch v0.19.0 // indirect | 	golang.org/x/arch v0.18.0 // indirect | ||||||
| 	golang.org/x/mod v0.26.0 // indirect | 	golang.org/x/mod v0.25.0 // indirect | ||||||
| 	golang.org/x/net v0.42.0 // indirect | 	golang.org/x/net v0.41.0 // indirect | ||||||
| 	golang.org/x/sync v0.16.0 // indirect | 	golang.org/x/sync v0.15.0 // indirect | ||||||
| 	golang.org/x/sys v0.34.0 // indirect | 	golang.org/x/sys v0.33.0 // indirect | ||||||
| 	golang.org/x/time v0.12.0 // indirect | 	golang.org/x/time v0.12.0 // indirect | ||||||
| 	golang.org/x/tools v0.35.0 // indirect | 	golang.org/x/tools v0.34.0 // indirect | ||||||
| 	golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect | 	golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect | ||||||
| 	golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 // indirect | 	golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 // indirect | ||||||
| 	google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 // indirect | 	google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect | ||||||
| 	google.golang.org/protobuf v1.36.6 // indirect | 	google.golang.org/protobuf v1.36.6 // indirect | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
| 	gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 // indirect | 	gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 // indirect | ||||||
|  |  | ||||||
							
								
								
									
										127
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										127
									
								
								go.sum
									
									
									
									
									
								
							|  | @ -1,18 +1,19 @@ | ||||||
| github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= | github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= | ||||||
| github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= | github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= | ||||||
|  | github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0 h1:Wo41lDOevRJSGpevP+8Pk5bANX7fJacO2w04aqLiC5I= | ||||||
|  | github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0/go.mod h1:FVGavL/QEBQDcBpr3fAojoK17xX5k9bicBphrOpP7uM= | ||||||
| github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= | github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= | ||||||
| github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= | github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= | ||||||
| github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= | github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0= | ||||||
| github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= | github.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= | ||||||
| github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= | github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= | ||||||
| github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= | github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= | ||||||
| github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= | github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= | ||||||
| github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= | github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= | ||||||
| github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= | github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= | ||||||
| github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= | github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= | ||||||
| github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= | github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= | ||||||
| github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= | github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= | ||||||
| github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= |  | ||||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | @ -35,8 +36,8 @@ github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w | ||||||
| github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= | github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= | ||||||
| github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= | github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= | ||||||
| github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= | github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= | ||||||
| github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= | github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= | ||||||
| github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||||
| github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||||
| github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | ||||||
|  | @ -50,6 +51,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn | ||||||
| github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= | ||||||
| github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= | github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= | ||||||
| github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= | github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= | ||||||
|  | github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= | ||||||
|  | github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= | ||||||
| github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= | github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= | ||||||
| github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= | github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= | ||||||
| github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= | github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= | ||||||
|  | @ -63,6 +66,8 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX | ||||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
| github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= | github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= | ||||||
| github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
|  | github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 h1:xhMrHhTJ6zxu3gA4enFM9MLn9AY7613teCdFnlUVbSQ= | ||||||
|  | github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= | ||||||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
| github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o= | github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o= | ||||||
|  | @ -88,8 +93,8 @@ github.com/juju/ratelimit v1.0.2/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSg | ||||||
| github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= | github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= | ||||||
| github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= | github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= | ||||||
| github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||||
| github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= | github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= | ||||||
| github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= | github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= | ||||||
| github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= | github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= | ||||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||||
| github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||||
|  | @ -101,10 +106,10 @@ github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr32 | ||||||
| github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= | github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= | ||||||
| github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= | ||||||
| github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | ||||||
| github.com/mattn/go-sqlite3 v1.14.30 h1:bVreufq3EAIG1Quvws73du3/QgdeZ3myglJlrzSYYCY= | github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= | ||||||
| github.com/mattn/go-sqlite3 v1.14.30/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= | github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= | ||||||
| github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= | github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE= | ||||||
| github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= | github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE= | ||||||
| github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
| github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= | ||||||
| github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
|  | @ -114,6 +119,10 @@ github.com/mymmrac/telego v0.32.0 h1:4X8C1l3k+opkk86r95+eQE8DxiS2LYlR61L/G7yreDY | ||||||
| github.com/mymmrac/telego v0.32.0/go.mod h1:qS6NaRhJgcuEEBEMVCV79S2xCAuHq9O+ixwfLuRW31M= | github.com/mymmrac/telego v0.32.0/go.mod h1:qS6NaRhJgcuEEBEMVCV79S2xCAuHq9O+ixwfLuRW31M= | ||||||
| github.com/nicksnyder/go-i18n/v2 v2.6.0 h1:C/m2NNWNiTB6SK4Ao8df5EWm3JETSTIGNXBpMJTxzxQ= | github.com/nicksnyder/go-i18n/v2 v2.6.0 h1:C/m2NNWNiTB6SK4Ao8df5EWm3JETSTIGNXBpMJTxzxQ= | ||||||
| github.com/nicksnyder/go-i18n/v2 v2.6.0/go.mod h1:88sRqr0C6OPyJn0/KRNaEz1uWorjxIKP7rUUcvycecE= | github.com/nicksnyder/go-i18n/v2 v2.6.0/go.mod h1:88sRqr0C6OPyJn0/KRNaEz1uWorjxIKP7rUUcvycecE= | ||||||
|  | github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= | ||||||
|  | github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= | ||||||
|  | github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= | ||||||
|  | github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= | ||||||
| github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= | github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= | ||||||
| github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= | github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= | ||||||
| github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= | github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= | ||||||
|  | @ -126,12 +135,14 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb | ||||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
| github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= | github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= | ||||||
| github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= | github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= | ||||||
|  | github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= | ||||||
|  | github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= | ||||||
| github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= | github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= | ||||||
| github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= | github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= | ||||||
| github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= | github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA= | ||||||
| github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= | github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ= | ||||||
| github.com/refraction-networking/utls v1.8.0 h1:L38krhiTAyj9EeiQQa2sg+hYb4qwLCqdMcpZrRfbONE= | github.com/refraction-networking/utls v1.7.3 h1:L0WRhHY7Oq1T0zkdzVZMR6zWZv+sXbHB9zcuvsAEqCo= | ||||||
| github.com/refraction-networking/utls v1.8.0/go.mod h1:jkSOEkLqn+S/jtpEHPOsVv/4V4EVnelwbMQl4vCWXAM= | github.com/refraction-networking/utls v1.7.3/go.mod h1:TUhh27RHMGtQvjQq+RyO11P6ZNQNBb3N0v7wsEjKAIQ= | ||||||
| github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= | github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= | ||||||
| github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= | github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= | ||||||
| github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= | github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= | ||||||
|  | @ -146,8 +157,8 @@ github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287 h1:qIQ0tWF9vxGtkJa2 | ||||||
| github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= | github.com/savsgio/gotils v0.0.0-20250408102913-196191ec6287/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= | ||||||
| github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 h1:emzAzMZ1L9iaKCTxdy3Em8Wv4ChIAGnfiz18Cda70g4= | github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 h1:emzAzMZ1L9iaKCTxdy3Em8Wv4ChIAGnfiz18Cda70g4= | ||||||
| github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg= | github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg= | ||||||
| github.com/shirou/gopsutil/v4 v4.25.7 h1:bNb2JuqKuAu3tRlPv5piSmBZyMfecwQ+t/ILq+1JqVM= | github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= | ||||||
| github.com/shirou/gopsutil/v4 v4.25.7/go.mod h1:XV/egmwJtd3ZQjBpJVY5kndsiOO4IRqy9TQnmm6VP7U= | github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= | ||||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
| github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= | ||||||
| github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | ||||||
|  | @ -171,8 +182,8 @@ github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e h1:5QefA066A1tF | ||||||
| github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e/go.mod h1:5t19P9LBIrNamL6AcMQOncg/r10y3Pc01AbHeMhwlpU= | github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e/go.mod h1:5t19P9LBIrNamL6AcMQOncg/r10y3Pc01AbHeMhwlpU= | ||||||
| github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= | ||||||
| github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= | ||||||
| github.com/valyala/fasthttp v1.64.0 h1:QBygLLQmiAyiXuRhthf0tuRkqAFcrC42dckN2S+N3og= | github.com/valyala/fasthttp v1.63.0 h1:DisIL8OjB7ul2d7cBaMRcKTQDYnrGy56R4FCiuDP0Ns= | ||||||
| github.com/valyala/fasthttp v1.64.0/go.mod h1:dGmFxwkWXSK0NbOSJuF7AMVzU+lkHz0wQVvVITv2UQA= | github.com/valyala/fasthttp v1.63.0/go.mod h1:REc4IeW+cAEyLrRPa5A81MIjvz0QE1laoTX2EaPHKJM= | ||||||
| github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= | github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= | ||||||
| github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= | github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= | ||||||
| github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0= | github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0= | ||||||
|  | @ -181,64 +192,66 @@ github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zd | ||||||
| github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= | github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= | ||||||
| github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po= | github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po= | ||||||
| github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg= | github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg= | ||||||
| github.com/xtls/reality v0.0.0-20250727231020-de3bb4d08f5a h1:Fs8Pc0JAc/LDOf9Q4DzKrk+Ujf4ILlyvfvDVZcmOZ2o= | github.com/xtls/reality v0.0.0-20250627141458-e62c4aed0d57 h1:CJzC54UytAYnNbJSlAFi9MXOofSUAtpoQTKIA3hUpj8= | ||||||
| github.com/xtls/reality v0.0.0-20250727231020-de3bb4d08f5a/go.mod h1:XxvnCCgBee4WWE0bc4E+a7wbk8gkJ/rS0vNVNtC5qp0= | github.com/xtls/reality v0.0.0-20250627141458-e62c4aed0d57/go.mod h1:yD47RN65bDLZgyHWMfFDiqlzrq4usDMt/Xzsk6tMbhw= | ||||||
| github.com/xtls/xray-core v1.250803.0 h1:sYdRC243UsujnePINH4IfM4MfHE4lj2p4wZFAfeE2GI= | github.com/xtls/xray-core v1.250608.0 h1:/M0LwzFeFAZf+vdZQhqNYjUXDfPv5hOeYw6jsiAdgWI= | ||||||
| github.com/xtls/xray-core v1.250803.0/go.mod h1:z2vn2o30flYEgpSz1iEhdZP1I46UZ3+gXINZyohH3yE= | github.com/xtls/xray-core v1.250608.0/go.mod h1:MkfIs2WZ5VLtZHAwDKosSS05Kx5zFFOzvly7Hy6pfPs= | ||||||
| github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= | github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= | ||||||
| github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= | github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= | ||||||
| github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= | ||||||
| github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | ||||||
| go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= | go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= | ||||||
| go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= | go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= | ||||||
| go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= | go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= | ||||||
| go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= | go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= | ||||||
| go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= | go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= | ||||||
| go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= | go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= | ||||||
| go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= | go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= | ||||||
| go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= | go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= | ||||||
| go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= | go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= | ||||||
| go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= | go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= | ||||||
| go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= | go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= | ||||||
| go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= | go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= | ||||||
| go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= | go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= | ||||||
| go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= | go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= | ||||||
|  | go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= | ||||||
|  | go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= | ||||||
| go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= | go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= | ||||||
| go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= | go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= | ||||||
| go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= | go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= | ||||||
| go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= | go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= | ||||||
| golang.org/x/arch v0.19.0 h1:LmbDQUodHThXE+htjrnmVD73M//D9GTH6wFZjyDkjyU= | golang.org/x/arch v0.18.0 h1:WN9poc33zL4AzGxqf8VtpKUnGvMi8O9lhNyBMF/85qc= | ||||||
| golang.org/x/arch v0.19.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= | golang.org/x/arch v0.18.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= | ||||||
| golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= | golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= | ||||||
| golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= | golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= | ||||||
| golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= | golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= | ||||||
| golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= | golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= | ||||||
| golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= | golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= | ||||||
| golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= | golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= | ||||||
| golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= | golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= | ||||||
| golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | ||||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= | golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= | ||||||
| golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||||
| golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= | golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= | ||||||
| golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= | golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= | ||||||
| golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= | golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= | ||||||
| golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= | golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= | ||||||
| golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= | golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= | ||||||
| golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= | golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= | ||||||
| golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg= | golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg= | ||||||
| golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= | golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= | ||||||
| golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 h1:/jFs0duh4rdb8uIfPMv78iAJGcPKDeqAFnaLBropIC4= | golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 h1:/jFs0duh4rdb8uIfPMv78iAJGcPKDeqAFnaLBropIC4= | ||||||
| golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173/go.mod h1:tkCQ4FQXmpAgYVh++1cq16/dH4QJtmvpRv19DWGAHSA= | golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173/go.mod h1:tkCQ4FQXmpAgYVh++1cq16/dH4QJtmvpRv19DWGAHSA= | ||||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 h1:MAKi5q709QWfnkkpNQ0M12hYJ1+e8qYVDyowc4U1XZM= | google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= | ||||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= | google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= | ||||||
| google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= | google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= | ||||||
| google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= | google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= | ||||||
| google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= | google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= | ||||||
| google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= | google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= | ||||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | @ -252,8 +265,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
| gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= | gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= | ||||||
| gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= | gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= | ||||||
| gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4= | gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= | ||||||
| gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= | gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= | ||||||
| gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 h1:sfK5nHuG7lRFZ2FdTT3RimOqWBg8IrVm+/Vko1FVOsk= | gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 h1:sfK5nHuG7lRFZ2FdTT3RimOqWBg8IrVm+/Vko1FVOsk= | ||||||
| gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5/go.mod h1:3r5CMtNQMKIvBlrmM9xWUNamjKBYPOWyXOjmg5Kts3g= | gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5/go.mod h1:3r5CMtNQMKIvBlrmM9xWUNamjKBYPOWyXOjmg5Kts3g= | ||||||
| lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= | lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= | ||||||
|  |  | ||||||
							
								
								
									
										27
									
								
								install.sh
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								install.sh
									
									
									
									
									
								
							|  | @ -7,7 +7,6 @@ yellow='\033[0;33m' | ||||||
| plain='\033[0m' | plain='\033[0m' | ||||||
| 
 | 
 | ||||||
| cur_dir=$(pwd) | cur_dir=$(pwd) | ||||||
| show_ip_service_lists=("https://api.ipify.org" "https://4.ident.me") |  | ||||||
| 
 | 
 | ||||||
| # check root | # check root | ||||||
| [[ $EUID -ne 0 ]] && echo -e "${red}Fatal error: ${plain} Please run this script with root privilege \n " && exit 1 | [[ $EUID -ne 0 ]] && echo -e "${red}Fatal error: ${plain} Please run this script with root privilege \n " && exit 1 | ||||||
|  | @ -86,17 +85,11 @@ config_after_install() { | ||||||
|     local existing_hasDefaultCredential=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'hasDefaultCredential: .+' | awk '{print $2}') |     local existing_hasDefaultCredential=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'hasDefaultCredential: .+' | awk '{print $2}') | ||||||
|     local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}') |     local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}') | ||||||
|     local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}') |     local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}') | ||||||
| 
 |     local server_ip=$(curl -s https://api.ipify.org) | ||||||
|     for ip_service_addr in "${show_ip_service_lists[@]}"; do |  | ||||||
|         local server_ip=$(curl -s --max-time 3 ${ip_service_addr} 2>/dev/null) |  | ||||||
|         if [ -n "${server_ip}" ]; then |  | ||||||
|             break |  | ||||||
|         fi |  | ||||||
|     done |  | ||||||
| 
 | 
 | ||||||
|     if [[ ${#existing_webBasePath} -lt 4 ]]; then |     if [[ ${#existing_webBasePath} -lt 4 ]]; then | ||||||
|         if [[ "$existing_hasDefaultCredential" == "true" ]]; then |         if [[ "$existing_hasDefaultCredential" == "true" ]]; then | ||||||
|             local config_webBasePath=$(gen_random_string 18) |             local config_webBasePath=$(gen_random_string 15) | ||||||
|             local config_username=$(gen_random_string 10) |             local config_username=$(gen_random_string 10) | ||||||
|             local config_password=$(gen_random_string 10) |             local config_password=$(gen_random_string 10) | ||||||
| 
 | 
 | ||||||
|  | @ -119,7 +112,7 @@ config_after_install() { | ||||||
|             echo -e "${green}Access URL: http://${server_ip}:${config_port}/${config_webBasePath}${plain}" |             echo -e "${green}Access URL: http://${server_ip}:${config_port}/${config_webBasePath}${plain}" | ||||||
|             echo -e "###############################################" |             echo -e "###############################################" | ||||||
|         else |         else | ||||||
|             local config_webBasePath=$(gen_random_string 18) |             local config_webBasePath=$(gen_random_string 15) | ||||||
|             echo -e "${yellow}WebBasePath is missing or too short. Generating a new one...${plain}" |             echo -e "${yellow}WebBasePath is missing or too short. Generating a new one...${plain}" | ||||||
|             /usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}" |             /usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}" | ||||||
|             echo -e "${green}New WebBasePath: ${config_webBasePath}${plain}" |             echo -e "${green}New WebBasePath: ${config_webBasePath}${plain}" | ||||||
|  | @ -148,7 +141,6 @@ config_after_install() { | ||||||
| install_x-ui() { | install_x-ui() { | ||||||
|     cd /usr/local/ |     cd /usr/local/ | ||||||
| 
 | 
 | ||||||
|     # Download resources |  | ||||||
|     if [ $# == 0 ]; then |     if [ $# == 0 ]; then | ||||||
|         tag_version=$(curl -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') |         tag_version=$(curl -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') | ||||||
|         if [[ ! -n "$tag_version" ]]; then |         if [[ ! -n "$tag_version" ]]; then | ||||||
|  | @ -179,35 +171,30 @@ install_x-ui() { | ||||||
|             exit 1 |             exit 1 | ||||||
|         fi |         fi | ||||||
|     fi |     fi | ||||||
|     wget -O /usr/bin/x-ui-temp https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh |  | ||||||
| 
 | 
 | ||||||
|     # Stop x-ui service and remove old resources |  | ||||||
|     if [[ -e /usr/local/x-ui/ ]]; then |     if [[ -e /usr/local/x-ui/ ]]; then | ||||||
|         systemctl stop x-ui |         systemctl stop x-ui | ||||||
|         rm /usr/local/x-ui/ -rf |         rm /usr/local/x-ui/ -rf | ||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|     # Extract resources and set permissions |  | ||||||
|     tar zxvf x-ui-linux-$(arch).tar.gz |     tar zxvf x-ui-linux-$(arch).tar.gz | ||||||
|     rm x-ui-linux-$(arch).tar.gz -f |     rm x-ui-linux-$(arch).tar.gz -f | ||||||
|      |  | ||||||
|     cd x-ui |     cd x-ui | ||||||
|     chmod +x x-ui |     chmod +x x-ui | ||||||
|     chmod +x x-ui.sh |  | ||||||
| 
 | 
 | ||||||
|     # Check the system's architecture and rename the file accordingly |     # Check the system's architecture and rename the file accordingly | ||||||
|     if [[ $(arch) == "armv5" || $(arch) == "armv6" || $(arch) == "armv7" ]]; then |     if [[ $(arch) == "armv5" || $(arch) == "armv6" || $(arch) == "armv7" ]]; then | ||||||
|         mv bin/xray-linux-$(arch) bin/xray-linux-arm |         mv bin/xray-linux-$(arch) bin/xray-linux-arm | ||||||
|         chmod +x bin/xray-linux-arm |         chmod +x bin/xray-linux-arm | ||||||
|     fi |     fi | ||||||
|     chmod +x x-ui bin/xray-linux-$(arch) |  | ||||||
| 
 | 
 | ||||||
|     # Update x-ui cli and se set permission |     chmod +x x-ui bin/xray-linux-$(arch) | ||||||
|     mv -f /usr/bin/x-ui-temp /usr/bin/x-ui |     cp -f x-ui.service /etc/systemd/system/ | ||||||
|  |     wget -O /usr/bin/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh | ||||||
|  |     chmod +x /usr/local/x-ui/x-ui.sh | ||||||
|     chmod +x /usr/bin/x-ui |     chmod +x /usr/bin/x-ui | ||||||
|     config_after_install |     config_after_install | ||||||
| 
 | 
 | ||||||
|     cp -f x-ui.service /etc/systemd/system/ |  | ||||||
|     systemctl daemon-reload |     systemctl daemon-reload | ||||||
|     systemctl enable x-ui |     systemctl enable x-ui | ||||||
|     systemctl start x-ui |     systemctl start x-ui | ||||||
|  |  | ||||||
|  | @ -263,7 +263,6 @@ func (s *SubJsonService) realityData(rData map[string]any) map[string]any { | ||||||
| 	rltyData["show"] = false | 	rltyData["show"] = false | ||||||
| 	rltyData["publicKey"] = rltyClientSettings["publicKey"] | 	rltyData["publicKey"] = rltyClientSettings["publicKey"] | ||||||
| 	rltyData["fingerprint"] = rltyClientSettings["fingerprint"] | 	rltyData["fingerprint"] = rltyClientSettings["fingerprint"] | ||||||
| 	rltyData["mldsa65Verify"] = rltyClientSettings["mldsa65Verify"] |  | ||||||
| 
 | 
 | ||||||
| 	// Set random data
 | 	// Set random data
 | ||||||
| 	rltyData["spiderX"] = "/" + random.Seq(15) | 	rltyData["spiderX"] = "/" + random.Seq(15) | ||||||
|  |  | ||||||
|  | @ -437,11 +437,6 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { | ||||||
| 					params["fp"] = fp | 					params["fp"] = fp | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			if pqvValue, ok := searchKey(realitySettings, "mldsa65Verify"); ok { |  | ||||||
| 				if pqv, ok := pqvValue.(string); ok && len(pqv) > 0 { |  | ||||||
| 					params["pqv"] = pqv |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			params["spx"] = "/" + random.Seq(15) | 			params["spx"] = "/" + random.Seq(15) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -632,11 +627,6 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string | ||||||
| 					params["fp"] = fp | 					params["fp"] = fp | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			if pqvValue, ok := searchKey(realitySettings, "mldsa65Verify"); ok { |  | ||||||
| 				if pqv, ok := pqvValue.(string); ok && len(pqv) > 0 { |  | ||||||
| 					params["pqv"] = pqv |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			params["spx"] = "/" + random.Seq(15) | 			params["spx"] = "/" + random.Seq(15) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -559,7 +559,7 @@ class TlsStreamSettings extends XrayCommonClass { | ||||||
|         disableSystemRoot = false, |         disableSystemRoot = false, | ||||||
|         enableSessionResumption = false, |         enableSessionResumption = false, | ||||||
|         certificates = [new TlsStreamSettings.Cert()], |         certificates = [new TlsStreamSettings.Cert()], | ||||||
|         alpn = [ALPN_OPTION.H2, ALPN_OPTION.HTTP1], |         alpn = [ALPN_OPTION.H3, ALPN_OPTION.H2, ALPN_OPTION.HTTP1], | ||||||
|         settings = new TlsStreamSettings.Settings() |         settings = new TlsStreamSettings.Settings() | ||||||
|     ) { |     ) { | ||||||
|         super(); |         super(); | ||||||
|  | @ -633,7 +633,7 @@ TlsStreamSettings.Cert = class extends XrayCommonClass { | ||||||
|         keyFile = '', |         keyFile = '', | ||||||
|         certificate = '', |         certificate = '', | ||||||
|         key = '', |         key = '', | ||||||
|         ocspStapling = 0, |         ocspStapling = 3600, | ||||||
|         oneTimeLoading = false, |         oneTimeLoading = false, | ||||||
|         usage = USAGE_OPTION.ENCIPHERMENT, |         usage = USAGE_OPTION.ENCIPHERMENT, | ||||||
|         buildChain = false, |         buildChain = false, | ||||||
|  | @ -725,14 +725,13 @@ class RealityStreamSettings extends XrayCommonClass { | ||||||
|     constructor( |     constructor( | ||||||
|         show = false, |         show = false, | ||||||
|         xver = 0, |         xver = 0, | ||||||
|         dest = 'google.com:443', |         dest = 'yahoo.com:443', | ||||||
|         serverNames = 'google.com,www.google.com', |         serverNames = 'yahoo.com,www.yahoo.com', | ||||||
|         privateKey = '', |         privateKey = '', | ||||||
|         minClientVer = '', |         minClient = '', | ||||||
|         maxClientVer = '', |         maxClient = '', | ||||||
|         maxTimediff = 0, |         maxTimediff = 0, | ||||||
|         shortIds = RandomUtil.randomShortIds(), |         shortIds = RandomUtil.randomShortIds(), | ||||||
|         mldsa65Seed = '', |  | ||||||
|         settings = new RealityStreamSettings.Settings() |         settings = new RealityStreamSettings.Settings() | ||||||
|     ) { |     ) { | ||||||
|         super(); |         super(); | ||||||
|  | @ -741,11 +740,10 @@ class RealityStreamSettings extends XrayCommonClass { | ||||||
|         this.dest = dest; |         this.dest = dest; | ||||||
|         this.serverNames = Array.isArray(serverNames) ? serverNames.join(",") : serverNames; |         this.serverNames = Array.isArray(serverNames) ? serverNames.join(",") : serverNames; | ||||||
|         this.privateKey = privateKey; |         this.privateKey = privateKey; | ||||||
|         this.minClientVer = minClientVer; |         this.minClient = minClient; | ||||||
|         this.maxClientVer = maxClientVer; |         this.maxClient = maxClient; | ||||||
|         this.maxTimediff = maxTimediff; |         this.maxTimediff = maxTimediff; | ||||||
|         this.shortIds = Array.isArray(shortIds) ? shortIds.join(",") : shortIds; |         this.shortIds = Array.isArray(shortIds) ? shortIds.join(",") : shortIds; | ||||||
|         this.mldsa65Seed = mldsa65Seed; |  | ||||||
|         this.settings = settings; |         this.settings = settings; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -756,8 +754,7 @@ class RealityStreamSettings extends XrayCommonClass { | ||||||
|                 json.settings.publicKey, |                 json.settings.publicKey, | ||||||
|                 json.settings.fingerprint, |                 json.settings.fingerprint, | ||||||
|                 json.settings.serverName, |                 json.settings.serverName, | ||||||
|                 json.settings.spiderX, |                 json.settings.spiderX | ||||||
|                 json.settings.mldsa65Verify, |  | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
|         return new RealityStreamSettings( |         return new RealityStreamSettings( | ||||||
|  | @ -766,11 +763,10 @@ class RealityStreamSettings extends XrayCommonClass { | ||||||
|             json.dest, |             json.dest, | ||||||
|             json.serverNames, |             json.serverNames, | ||||||
|             json.privateKey, |             json.privateKey, | ||||||
|             json.minClientVer, |             json.minClient, | ||||||
|             json.maxClientVer, |             json.maxClient, | ||||||
|             json.maxTimediff, |             json.maxTimediff, | ||||||
|             json.shortIds, |             json.shortIds, | ||||||
|             json.mldsa65Seed, |  | ||||||
|             settings, |             settings, | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|  | @ -782,11 +778,10 @@ class RealityStreamSettings extends XrayCommonClass { | ||||||
|             dest: this.dest, |             dest: this.dest, | ||||||
|             serverNames: this.serverNames.split(","), |             serverNames: this.serverNames.split(","), | ||||||
|             privateKey: this.privateKey, |             privateKey: this.privateKey, | ||||||
|             minClientVer: this.minClientVer, |             minClient: this.minClient, | ||||||
|             maxClientVer: this.maxClientVer, |             maxClient: this.maxClient, | ||||||
|             maxTimediff: this.maxTimediff, |             maxTimediff: this.maxTimediff, | ||||||
|             shortIds: this.shortIds.split(","), |             shortIds: this.shortIds.split(","), | ||||||
|             mldsa65Seed: this.mldsa65Seed, |  | ||||||
|             settings: this.settings, |             settings: this.settings, | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
|  | @ -797,15 +792,13 @@ RealityStreamSettings.Settings = class extends XrayCommonClass { | ||||||
|         publicKey = '', |         publicKey = '', | ||||||
|         fingerprint = UTLS_FINGERPRINT.UTLS_CHROME, |         fingerprint = UTLS_FINGERPRINT.UTLS_CHROME, | ||||||
|         serverName = '', |         serverName = '', | ||||||
|         spiderX = '/', |         spiderX = '/' | ||||||
|         mldsa65Verify = '' |  | ||||||
|     ) { |     ) { | ||||||
|         super(); |         super(); | ||||||
|         this.publicKey = publicKey; |         this.publicKey = publicKey; | ||||||
|         this.fingerprint = fingerprint; |         this.fingerprint = fingerprint; | ||||||
|         this.serverName = serverName; |         this.serverName = serverName; | ||||||
|         this.spiderX = spiderX; |         this.spiderX = spiderX; | ||||||
|         this.mldsa65Verify = mldsa65Verify; |  | ||||||
|     } |     } | ||||||
|     static fromJson(json = {}) { |     static fromJson(json = {}) { | ||||||
|         return new RealityStreamSettings.Settings( |         return new RealityStreamSettings.Settings( | ||||||
|  | @ -813,7 +806,6 @@ RealityStreamSettings.Settings = class extends XrayCommonClass { | ||||||
|             json.fingerprint, |             json.fingerprint, | ||||||
|             json.serverName, |             json.serverName, | ||||||
|             json.spiderX, |             json.spiderX, | ||||||
|             json.mldsa65Verify |  | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|     toJson() { |     toJson() { | ||||||
|  | @ -822,7 +814,6 @@ RealityStreamSettings.Settings = class extends XrayCommonClass { | ||||||
|             fingerprint: this.fingerprint, |             fingerprint: this.fingerprint, | ||||||
|             serverName: this.serverName, |             serverName: this.serverName, | ||||||
|             spiderX: this.spiderX, |             spiderX: this.spiderX, | ||||||
|             mldsa65Verify: this.mldsa65Verify |  | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  | @ -1394,9 +1385,6 @@ class Inbound extends XrayCommonClass { | ||||||
|             if (!ObjectUtil.isEmpty(this.stream.reality.settings.spiderX)) { |             if (!ObjectUtil.isEmpty(this.stream.reality.settings.spiderX)) { | ||||||
|                 params.set("spx", this.stream.reality.settings.spiderX); |                 params.set("spx", this.stream.reality.settings.spiderX); | ||||||
|             } |             } | ||||||
|             if (!ObjectUtil.isEmpty(this.stream.reality.settings.mldsa65Verify)) { |  | ||||||
|                 params.set("pqv", this.stream.reality.settings.mldsa65Verify); |  | ||||||
|             } |  | ||||||
|             if (type == 'tcp' && !ObjectUtil.isEmpty(flow)) { |             if (type == 'tcp' && !ObjectUtil.isEmpty(flow)) { | ||||||
|                 params.set("flow", flow); |                 params.set("flow", flow); | ||||||
|             } |             } | ||||||
|  | @ -1571,9 +1559,6 @@ class Inbound extends XrayCommonClass { | ||||||
|             if (!ObjectUtil.isEmpty(this.stream.reality.settings.spiderX)) { |             if (!ObjectUtil.isEmpty(this.stream.reality.settings.spiderX)) { | ||||||
|                 params.set("spx", this.stream.reality.settings.spiderX); |                 params.set("spx", this.stream.reality.settings.spiderX); | ||||||
|             } |             } | ||||||
|             if (!ObjectUtil.isEmpty(this.stream.reality.settings.mldsa65Verify)) { |  | ||||||
|                 params.set("pqv", this.stream.reality.settings.mldsa65Verify); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         else { |         else { | ||||||
|  | @ -2164,7 +2149,7 @@ Inbound.TrojanSettings.Fallback = class extends XrayCommonClass { | ||||||
| Inbound.ShadowsocksSettings = class extends Inbound.Settings { | Inbound.ShadowsocksSettings = class extends Inbound.Settings { | ||||||
|     constructor(protocol, |     constructor(protocol, | ||||||
|         method = SSMethods.BLAKE3_AES_256_GCM, |         method = SSMethods.BLAKE3_AES_256_GCM, | ||||||
|         password = RandomUtil.randomShadowsocksPassword(), |         password = '', | ||||||
|         network = 'tcp,udp', |         network = 'tcp,udp', | ||||||
|         shadowsockses = [new Inbound.ShadowsocksSettings.Shadowsocks()], |         shadowsockses = [new Inbound.ShadowsocksSettings.Shadowsocks()], | ||||||
|         ivCheck = false, |         ivCheck = false, | ||||||
|  | @ -2202,7 +2187,7 @@ Inbound.ShadowsocksSettings = class extends Inbound.Settings { | ||||||
| Inbound.ShadowsocksSettings.Shadowsocks = class extends XrayCommonClass { | Inbound.ShadowsocksSettings.Shadowsocks = class extends XrayCommonClass { | ||||||
|     constructor( |     constructor( | ||||||
|         method = '', |         method = '', | ||||||
|         password = RandomUtil.randomShadowsocksPassword(), |         password = '', | ||||||
|         email = RandomUtil.randomLowerAndNum(8), |         email = RandomUtil.randomLowerAndNum(8), | ||||||
|         limitIp = 0, |         limitIp = 0, | ||||||
|         totalGB = 0, |         totalGB = 0, | ||||||
|  |  | ||||||
|  | @ -388,8 +388,7 @@ class RealityStreamSettings extends CommonClass { | ||||||
|         fingerprint = '', |         fingerprint = '', | ||||||
|         serverName = '', |         serverName = '', | ||||||
|         shortId = '', |         shortId = '', | ||||||
|         spiderX = '', |         spiderX = '/' | ||||||
|         mldsa65Verify = '' |  | ||||||
|     ) { |     ) { | ||||||
|         super(); |         super(); | ||||||
|         this.publicKey = publicKey; |         this.publicKey = publicKey; | ||||||
|  | @ -397,7 +396,6 @@ class RealityStreamSettings extends CommonClass { | ||||||
|         this.serverName = serverName; |         this.serverName = serverName; | ||||||
|         this.shortId = shortId |         this.shortId = shortId | ||||||
|         this.spiderX = spiderX; |         this.spiderX = spiderX; | ||||||
|         this.mldsa65Verify = mldsa65Verify; |  | ||||||
|     } |     } | ||||||
|     static fromJson(json = {}) { |     static fromJson(json = {}) { | ||||||
|         return new RealityStreamSettings( |         return new RealityStreamSettings( | ||||||
|  | @ -406,7 +404,6 @@ class RealityStreamSettings extends CommonClass { | ||||||
|             json.serverName, |             json.serverName, | ||||||
|             json.shortId, |             json.shortId, | ||||||
|             json.spiderX, |             json.spiderX, | ||||||
|             json.mldsa65Verify |  | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|     toJson() { |     toJson() { | ||||||
|  | @ -416,7 +413,6 @@ class RealityStreamSettings extends CommonClass { | ||||||
|             serverName: this.serverName, |             serverName: this.serverName, | ||||||
|             shortId: this.shortId, |             shortId: this.shortId, | ||||||
|             spiderX: this.spiderX, |             spiderX: this.spiderX, | ||||||
|             mldsa65Verify: this.mldsa65Verify |  | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  | @ -791,8 +787,7 @@ class Outbound extends CommonClass { | ||||||
|             let sni = url.searchParams.get('sni') ?? ''; |             let sni = url.searchParams.get('sni') ?? ''; | ||||||
|             let sid = url.searchParams.get('sid') ?? ''; |             let sid = url.searchParams.get('sid') ?? ''; | ||||||
|             let spx = url.searchParams.get('spx') ?? ''; |             let spx = url.searchParams.get('spx') ?? ''; | ||||||
|             let pqv = url.searchParams.get('pqv') ?? ''; |             stream.reality = new RealityStreamSettings(pbk, fp, sni, sid, spx); | ||||||
|             stream.reality = new RealityStreamSettings(pbk, fp, sni, sid, spx, pqv); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         const regex = /([^@]+):\/\/([^@]+)@(.+):(\d+)(.*)$/; |         const regex = /([^@]+):\/\/([^@]+)@(.+):(\d+)(.*)$/; | ||||||
|  |  | ||||||
|  | @ -47,7 +47,6 @@ func (a *APIController) initRouter(g *gin.RouterGroup) { | ||||||
| 		{"POST", "/resetAllClientTraffics/:id", a.inboundController.resetAllClientTraffics}, | 		{"POST", "/resetAllClientTraffics/:id", a.inboundController.resetAllClientTraffics}, | ||||||
| 		{"POST", "/delDepletedClients/:id", a.inboundController.delDepletedClients}, | 		{"POST", "/delDepletedClients/:id", a.inboundController.delDepletedClients}, | ||||||
| 		{"POST", "/onlines", a.inboundController.onlines}, | 		{"POST", "/onlines", a.inboundController.onlines}, | ||||||
| 		{"POST", "/updateClientTraffic/:email", a.inboundController.updateClientTraffic}, |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for _, route := range inboundRoutes { | 	for _, route := range inboundRoutes { | ||||||
|  |  | ||||||
|  | @ -339,28 +339,3 @@ func (a *InboundController) delDepletedClients(c *gin.Context) { | ||||||
| func (a *InboundController) onlines(c *gin.Context) { | func (a *InboundController) onlines(c *gin.Context) { | ||||||
| 	jsonObj(c, a.inboundService.GetOnlineClients(), nil) | 	jsonObj(c, a.inboundService.GetOnlineClients(), nil) | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func (a *InboundController) updateClientTraffic(c *gin.Context) { |  | ||||||
| 	email := c.Param("email") |  | ||||||
| 	 |  | ||||||
| 	// Define the request structure for traffic update
 |  | ||||||
| 	type TrafficUpdateRequest struct { |  | ||||||
| 		Upload   int64 `json:"upload"` |  | ||||||
| 		Download int64 `json:"download"` |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	var request TrafficUpdateRequest |  | ||||||
| 	err := c.ShouldBindJSON(&request) |  | ||||||
| 	if err != nil { |  | ||||||
| 		jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.inboundUpdateSuccess"), err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	err = a.inboundService.UpdateClientTrafficByEmail(email, request.Upload, request.Download) |  | ||||||
| 	if err != nil { |  | ||||||
| 		jsonMsg(c, I18nWeb(c, "somethingWentWrong"), err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.inboundClientUpdateSuccess"), nil) |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -50,7 +50,6 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) { | ||||||
| 	g.GET("/getDb", a.getDb) | 	g.GET("/getDb", a.getDb) | ||||||
| 	g.POST("/importDB", a.importDB) | 	g.POST("/importDB", a.importDB) | ||||||
| 	g.POST("/getNewX25519Cert", a.getNewX25519Cert) | 	g.POST("/getNewX25519Cert", a.getNewX25519Cert) | ||||||
| 	g.POST("/getNewmldsa65", a.getNewmldsa65) |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (a *ServerController) refreshStatus() { | func (a *ServerController) refreshStatus() { | ||||||
|  | @ -199,12 +198,3 @@ func (a *ServerController) getNewX25519Cert(c *gin.Context) { | ||||||
| 	} | 	} | ||||||
| 	jsonObj(c, cert, nil) | 	jsonObj(c, cert, nil) | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func (a *ServerController) getNewmldsa65(c *gin.Context) { |  | ||||||
| 	cert, err := a.serverService.GetNewmldsa65() |  | ||||||
| 	if err != nil { |  | ||||||
| 		jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.getNewmldsa65Error"), err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	jsonObj(c, cert, nil) |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -444,16 +444,13 @@ | ||||||
|             </a-select> |             </a-select> | ||||||
|           </a-form-item> |           </a-form-item> | ||||||
|           <a-form-item label="Short ID"> |           <a-form-item label="Short ID"> | ||||||
|             <a-input v-model.trim="outbound.stream.reality.shortId"></a-input> |             <a-input v-model.trim="outbound.stream.reality.shortId" :style="{ width: '250px' }"></a-input> | ||||||
|           </a-form-item> |           </a-form-item> | ||||||
|           <a-form-item label="SpiderX"> |           <a-form-item label="SpiderX"> | ||||||
|             <a-input v-model.trim="outbound.stream.reality.spiderX"></a-input> |             <a-input v-model.trim="outbound.stream.reality.spiderX" :style="{ width: '250px' }"></a-input> | ||||||
|           </a-form-item> |           </a-form-item> | ||||||
|           <a-form-item label="Public Key"> |           <a-form-item label="Public Key"> | ||||||
|             <a-textarea v-model.trim="outbound.stream.reality.publicKey"></a-textarea> |             <a-input v-model.trim="outbound.stream.reality.publicKey"></a-input> | ||||||
|           </a-form-item> |  | ||||||
|           <a-form-item label="mldsa65 Verify"> |  | ||||||
|             <a-textarea v-model.trim="outbound.stream.reality.mldsa65Verify"></a-textarea> |  | ||||||
|           </a-form-item> |           </a-form-item> | ||||||
|         </template> |         </template> | ||||||
|       </template> |       </template> | ||||||
|  |  | ||||||
|  | @ -21,12 +21,14 @@ | ||||||
|     <a-form-item label='Max Time Diff (ms)'> |     <a-form-item label='Max Time Diff (ms)'> | ||||||
|         <a-input-number v-model.number="inbound.stream.reality.maxTimediff" :min="0"></a-input-number> |         <a-input-number v-model.number="inbound.stream.reality.maxTimediff" :min="0"></a-input-number> | ||||||
|     </a-form-item> |     </a-form-item> | ||||||
|     <a-form-item label='Min Client Ver'> |     <!-- we also have this but i think it's not necessary | ||||||
|         <a-input v-model.trim="inbound.stream.reality.minClientVer"></a-input> |     <a-form-item label='Min Client'> | ||||||
|  |         <a-input v-model.trim="inbound.stream.reality.minClient"></a-input> | ||||||
|     </a-form-item> |     </a-form-item> | ||||||
|     <a-form-item label='Max Client Ver'> |     <a-form-item label='Max Client'> | ||||||
|         <a-input v-model.trim="inbound.stream.reality.maxClientVer"></a-input> |         <a-input v-model.trim="inbound.stream.reality.maxClient"></a-input> | ||||||
|     </a-form-item> |     </a-form-item> | ||||||
|  |     --> | ||||||
|     <a-form-item> |     <a-form-item> | ||||||
|         <template slot="label"> |         <template slot="label"> | ||||||
|             <a-tooltip> |             <a-tooltip> | ||||||
|  | @ -36,28 +38,19 @@ | ||||||
|                     type="sync"></a-icon> |                     type="sync"></a-icon> | ||||||
|             </a-tooltip> |             </a-tooltip> | ||||||
|         </template> |         </template> | ||||||
|         <a-textarea v-model.trim="inbound.stream.reality.shortIds"></a-textarea> |         <a-input v-model.trim="inbound.stream.reality.shortIds"></a-input> | ||||||
|     </a-form-item> |     </a-form-item> | ||||||
|     <a-form-item label='SpiderX'> |     <a-form-item label='SpiderX'> | ||||||
|         <a-input v-model.trim="inbound.stream.reality.settings.spiderX"></a-input> |         <a-input v-model.trim="inbound.stream.reality.settings.spiderX"></a-input> | ||||||
|     </a-form-item> |     </a-form-item> | ||||||
|     <a-form-item label='{{ i18n "pages.inbounds.publicKey" }}'> |     <a-form-item label='{{ i18n "pages.inbounds.publicKey" }}'> | ||||||
|         <a-textarea v-model="inbound.stream.reality.settings.publicKey"></a-textarea> |         <a-input v-model="inbound.stream.reality.settings.publicKey"></a-input> | ||||||
|     </a-form-item> |     </a-form-item> | ||||||
|     <a-form-item label='{{ i18n "pages.inbounds.privatekey" }}'> |     <a-form-item label='{{ i18n "pages.inbounds.privatekey" }}'> | ||||||
|         <a-textarea v-model="inbound.stream.reality.privateKey"></a-textarea> |         <a-input type="password" v-model="inbound.stream.reality.privateKey"></a-input> | ||||||
|     </a-form-item> |     </a-form-item> | ||||||
|     <a-form-item label=" "> |     <a-form-item label=" "> | ||||||
|         <a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Cert</a-button> |         <a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Cert</a-button> | ||||||
|     </a-form-item> |     </a-form-item> | ||||||
|     <a-form-item label="mldsa65 Seed"> |  | ||||||
|         <a-textarea v-model="inbound.stream.reality.mldsa65Seed"></a-textarea> |  | ||||||
|     </a-form-item> |  | ||||||
|     <a-form-item label="mldsa65 Verify"> |  | ||||||
|         <a-textarea v-model="inbound.stream.reality.settings.mldsa65Verify"></a-textarea> |  | ||||||
|     </a-form-item> |  | ||||||
|     <a-form-item label=" "> |  | ||||||
|         <a-button type="primary" icon="import" @click="getNewmldsa65">Get New Seed</a-button> |  | ||||||
|     </a-form-item> |  | ||||||
| </template> | </template> | ||||||
| {{end}} | {{end}} | ||||||
|  | @ -85,10 +85,10 @@ | ||||||
|       </template> |       </template> | ||||||
|       <template v-else> |       <template v-else> | ||||||
|         <a-form-item label='{{ i18n "pages.inbounds.publicKey" }}'> |         <a-form-item label='{{ i18n "pages.inbounds.publicKey" }}'> | ||||||
|           <a-textarea v-model="cert.cert"></a-textarea> |           <a-input v-model="cert.cert"></a-input> | ||||||
|         </a-form-item> |         </a-form-item> | ||||||
|         <a-form-item label='{{ i18n "pages.inbounds.privatekey" }}'> |         <a-form-item label='{{ i18n "pages.inbounds.privatekey" }}'> | ||||||
|           <a-textarea v-model="cert.key"></a-textarea> |           <a-input type="password" v-model="cert.key"></a-input> | ||||||
|         </a-form-item> |         </a-form-item> | ||||||
|       </template> |       </template> | ||||||
|       <a-form-item label='OCSP stapling'> |       <a-form-item label='OCSP stapling'> | ||||||
|  |  | ||||||
|  | @ -298,6 +298,12 @@ | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|    |    | ||||||
|  |     @media (max-width: 1024px) { | ||||||
|  |     .title { | ||||||
|  |       font-size: 1.4rem; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   .words-wrapper { |   .words-wrapper { | ||||||
|     width: 100%; |     width: 100%; | ||||||
|     display: inline-block; |     display: inline-block; | ||||||
|  |  | ||||||
|  | @ -47,7 +47,7 @@ | ||||||
|                 } |                 } | ||||||
|                 this.oldClientId = this.getClientId(dbInbound.protocol, clients[index]); |                 this.oldClientId = this.getClientId(dbInbound.protocol, clients[index]); | ||||||
|             } else { |             } else { | ||||||
|                 this.addClient(this.inbound, this.clients); |                 this.addClient(this.inbound.protocol, this.clients); | ||||||
|             } |             } | ||||||
|             this.clientStats = this.dbInbound.clientStats.find(row => row.email === this.clients[this.index].email); |             this.clientStats = this.dbInbound.clientStats.find(row => row.email === this.clients[this.index].email); | ||||||
|             this.confirm = confirm; |             this.confirm = confirm; | ||||||
|  | @ -59,12 +59,12 @@ | ||||||
|                 default: return client.id; |                 default: return client.id; | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         addClient(inbound, clients) { |         addClient(protocol, clients) { | ||||||
|             switch (inbound.protocol) { |             switch (protocol) { | ||||||
|                 case Protocols.VMESS: return clients.push(new Inbound.VmessSettings.VMESS()); |                 case Protocols.VMESS: return clients.push(new Inbound.VmessSettings.VMESS()); | ||||||
|                 case Protocols.VLESS: return clients.push(new Inbound.VLESSSettings.VLESS()); |                 case Protocols.VLESS: return clients.push(new Inbound.VLESSSettings.VLESS()); | ||||||
|                 case Protocols.TROJAN: return clients.push(new Inbound.TrojanSettings.Trojan()); |                 case Protocols.TROJAN: return clients.push(new Inbound.TrojanSettings.Trojan()); | ||||||
|                 case Protocols.SHADOWSOCKS: return clients.push(new Inbound.ShadowsocksSettings.Shadowsocks(clients[0].method, RandomUtil.randomShadowsocksPassword(inbound.settings.method))); |                 case Protocols.SHADOWSOCKS: return clients.push(new Inbound.ShadowsocksSettings.Shadowsocks(clients[0].method)); | ||||||
|                 default: return null; |                 default: return null; | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|  |  | ||||||
|  | @ -104,8 +104,6 @@ | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|             SSMethodChange() { |             SSMethodChange() { | ||||||
|                 this.inModal.inbound.settings.password = RandomUtil.randomShadowsocksPassword(this.inModal.inbound.settings.method) |  | ||||||
|                  |  | ||||||
|                 if (this.inModal.inbound.isSSMultiUser) { |                 if (this.inModal.inbound.isSSMultiUser) { | ||||||
|                     if (this.inModal.inbound.settings.shadowsockses.length ==0){ |                     if (this.inModal.inbound.settings.shadowsockses.length ==0){ | ||||||
|                         this.inModal.inbound.settings.shadowsockses = [new Inbound.ShadowsocksSettings.Shadowsocks()]; |                         this.inModal.inbound.settings.shadowsockses = [new Inbound.ShadowsocksSettings.Shadowsocks()]; | ||||||
|  | @ -119,9 +117,6 @@ | ||||||
|                             client.method = ""; |                             client.method = ""; | ||||||
|                         }) |                         }) | ||||||
|                     } |                     } | ||||||
|                     this.inModal.inbound.settings.shadowsockses.forEach(client => { |  | ||||||
|                         client.password = RandomUtil.randomShadowsocksPassword(this.inModal.inbound.settings.method) |  | ||||||
|                     }) |  | ||||||
|                 } else { |                 } else { | ||||||
|                     if (this.inModal.inbound.settings.shadowsockses.length > 0){ |                     if (this.inModal.inbound.settings.shadowsockses.length > 0){ | ||||||
|                         this.inModal.inbound.settings.shadowsockses = []; |                         this.inModal.inbound.settings.shadowsockses = []; | ||||||
|  | @ -141,17 +136,7 @@ | ||||||
|                 } |                 } | ||||||
|                 inModal.inbound.stream.reality.privateKey = msg.obj.privateKey; |                 inModal.inbound.stream.reality.privateKey = msg.obj.privateKey; | ||||||
|                 inModal.inbound.stream.reality.settings.publicKey = msg.obj.publicKey; |                 inModal.inbound.stream.reality.settings.publicKey = msg.obj.publicKey; | ||||||
|             }, |  | ||||||
|             async getNewmldsa65() { |  | ||||||
|                 inModal.loading(true); |  | ||||||
|                 const msg = await HttpUtil.post('/server/getNewmldsa65'); |  | ||||||
|                 inModal.loading(false); |  | ||||||
|                 if (!msg.success) { |  | ||||||
|                     return; |  | ||||||
|             } |             } | ||||||
|                 inModal.inbound.stream.reality.mldsa65Seed = msg.obj.seed; |  | ||||||
|                 inModal.inbound.stream.reality.settings.mldsa65Verify = msg.obj.verify; |  | ||||||
|             }, |  | ||||||
|         }, |         }, | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1785,21 +1785,6 @@ func (s *InboundService) GetClientTrafficByEmail(email string) (traffic *xray.Cl | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *InboundService) UpdateClientTrafficByEmail(email string, upload int64, download int64) error { |  | ||||||
| 	db := database.GetDB() |  | ||||||
| 
 |  | ||||||
| 	result := db.Model(xray.ClientTraffic{}). |  | ||||||
| 		Where("email = ?", email). |  | ||||||
| 		Updates(map[string]any{"up": upload, "down": download}) |  | ||||||
| 
 |  | ||||||
| 	err := result.Error |  | ||||||
| 	if err != nil { |  | ||||||
| 		logger.Warningf("Error updating ClientTraffic with email %s: %v", email, err) |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *InboundService) GetClientTrafficByID(id string) ([]xray.ClientTraffic, error) { | func (s *InboundService) GetClientTrafficByID(id string) ([]xray.ClientTraffic, error) { | ||||||
| 	db := database.GetDB() | 	db := database.GetDB() | ||||||
| 	var traffics []xray.ClientTraffic | 	var traffics []xray.ClientTraffic | ||||||
|  |  | ||||||
|  | @ -94,34 +94,21 @@ type ServerService struct { | ||||||
| 	inboundService InboundService | 	inboundService InboundService | ||||||
| 	cachedIPv4     string | 	cachedIPv4     string | ||||||
| 	cachedIPv6     string | 	cachedIPv6     string | ||||||
| 	noIPv6         bool |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func getPublicIP(url string) string { | func getPublicIP(url string) string { | ||||||
| 	client := &http.Client{ | 	resp, err := http.Get(url) | ||||||
| 		Timeout: 3 * time.Second, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	resp, err := client.Get(url) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "N/A" | 		return "N/A" | ||||||
| 	} | 	} | ||||||
| 	defer resp.Body.Close() | 	defer resp.Body.Close() | ||||||
| 
 | 
 | ||||||
| 	// Don't retry if access is blocked or region-restricted
 |  | ||||||
| 	if resp.StatusCode == http.StatusForbidden || resp.StatusCode == http.StatusUnavailableForLegalReasons { |  | ||||||
| 		return "N/A" |  | ||||||
| 	} |  | ||||||
| 	if resp.StatusCode != http.StatusOK { |  | ||||||
| 		return "N/A" |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	ip, err := io.ReadAll(resp.Body) | 	ip, err := io.ReadAll(resp.Body) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "N/A" | 		return "N/A" | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ipString := strings.TrimSpace(string(ip)) | 	ipString := string(ip) | ||||||
| 	if ipString == "" { | 	if ipString == "" { | ||||||
| 		return "N/A" | 		return "N/A" | ||||||
| 	} | 	} | ||||||
|  | @ -234,31 +221,10 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// IP fetching with caching
 | 	// IP fetching with caching
 | ||||||
| 	showIp4ServiceLists := []string{"https://api.ipify.org", "https://4.ident.me"} | 	if s.cachedIPv4 == "" || s.cachedIPv6 == "" { | ||||||
| 	showIp6ServiceLists := []string{"https://api6.ipify.org", "https://6.ident.me"} | 		s.cachedIPv4 = getPublicIP("https://api.ipify.org") | ||||||
| 
 | 		s.cachedIPv6 = getPublicIP("https://api6.ipify.org") | ||||||
| 	if s.cachedIPv4 == "" { |  | ||||||
| 		for _, ip4Service := range showIp4ServiceLists { |  | ||||||
| 			s.cachedIPv4 = getPublicIP(ip4Service) |  | ||||||
| 			if s.cachedIPv4 != "N/A" { |  | ||||||
| 				break |  | ||||||
| 	} | 	} | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if s.cachedIPv6 == "" && !s.noIPv6 { |  | ||||||
| 		for _, ip6Service := range showIp6ServiceLists { |  | ||||||
| 			s.cachedIPv6 = getPublicIP(ip6Service) |  | ||||||
| 			if s.cachedIPv6 != "N/A" { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if s.cachedIPv6 == "N/A" { |  | ||||||
| 		s.noIPv6 = true |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	status.PublicIP.IPv4 = s.cachedIPv4 | 	status.PublicIP.IPv4 = s.cachedIPv4 | ||||||
| 	status.PublicIP.IPv6 = s.cachedIPv6 | 	status.PublicIP.IPv6 = s.cachedIPv6 | ||||||
| 
 | 
 | ||||||
|  | @ -329,7 +295,7 @@ func (s *ServerService) GetXrayVersions() ([]string, error) { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if major > 25 || (major == 25 && minor > 7) || (major == 25 && minor == 7 && patch >= 26) { | 		if major > 25 || (major == 25 && minor > 6) || (major == 25 && minor == 6 && patch >= 8) { | ||||||
| 			versions = append(versions, release.TagName) | 			versions = append(versions, release.TagName) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -717,29 +683,3 @@ func (s *ServerService) GetNewX25519Cert() (any, error) { | ||||||
| 
 | 
 | ||||||
| 	return keyPair, nil | 	return keyPair, nil | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func (s *ServerService) GetNewmldsa65() (any, error) { |  | ||||||
| 	// Run the command
 |  | ||||||
| 	cmd := exec.Command(xray.GetBinaryPath(), "mldsa65") |  | ||||||
| 	var out bytes.Buffer |  | ||||||
| 	cmd.Stdout = &out |  | ||||||
| 	err := cmd.Run() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	lines := strings.Split(out.String(), "\n") |  | ||||||
| 
 |  | ||||||
| 	SeedLine := strings.Split(lines[0], ":") |  | ||||||
| 	VerifyLine := strings.Split(lines[1], ":") |  | ||||||
| 
 |  | ||||||
| 	seed := strings.TrimSpace(SeedLine[1]) |  | ||||||
| 	verify := strings.TrimSpace(VerifyLine[1]) |  | ||||||
| 
 |  | ||||||
| 	keyPair := map[string]any{ |  | ||||||
| 		"seed":   seed, |  | ||||||
| 		"verify": verify, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return keyPair, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -173,6 +173,8 @@ | ||||||
| "deleteClient" = "حذف العميل" | "deleteClient" = "حذف العميل" | ||||||
| "deleteClientContent" = "متأكد إنك عايز تحذف العميل؟" | "deleteClientContent" = "متأكد إنك عايز تحذف العميل؟" | ||||||
| "resetTrafficContent" = "متأكد إنك عايز تعيد ضبط الترافيك؟" | "resetTrafficContent" = "متأكد إنك عايز تعيد ضبط الترافيك؟" | ||||||
|  | "inboundUpdateSuccess" = "تم تحديث الوارد بنجاح." | ||||||
|  | "inboundCreateSuccess" = "تم إنشاء الوارد بنجاح." | ||||||
| "copyLink" = "انسخ الرابط" | "copyLink" = "انسخ الرابط" | ||||||
| "address" = "العنوان" | "address" = "العنوان" | ||||||
| "network" = "الشبكة" | "network" = "الشبكة" | ||||||
|  | @ -258,7 +260,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور" | "resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور" | ||||||
| "trafficGetError" = "خطأ في الحصول على حركات المرور" | "trafficGetError" = "خطأ في الحصول على حركات المرور" | ||||||
| "getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519." | "getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519." | ||||||
| "getNewmldsa65Error" = "حدث خطاء في الحصول على mldsa65." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "طلب" | "request" = "طلب" | ||||||
|  | @ -643,6 +644,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 اتحدّث في: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 اتحدّث في: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ أيوه" | "yes" = "✅ أيوه" | ||||||
| "no" = "❌ لأ" | "no" = "❌ لأ" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 الـ ID اتحدث." | "received_id" = "🔑📥 الـ ID اتحدث." | ||||||
| "received_password" = "🔑📥 الباسورد اتحدث." | "received_password" = "🔑📥 الباسورد اتحدث." | ||||||
| "received_email" = "📧📥 الإيميل اتحدث." | "received_email" = "📧📥 الإيميل اتحدث." | ||||||
|  | @ -662,6 +664,7 @@ | ||||||
| "FailedResetTraffic" = "📧 البريد الإلكتروني: {{ .ClientEmail }}\n🏁 النتيجة: ❌ فشل \n\n🛠️ الخطأ: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 البريد الإلكتروني: {{ .ClientEmail }}\n🏁 النتيجة: ❌ فشل \n\n🛠️ الخطأ: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 عملية إعادة ضبط الترافيك خلصت لكل العملاء." | "FinishProcess" = "🔚 عملية إعادة ضبط الترافيك خلصت لكل العملاء." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ اقفل الكيبورد" | "closeKeyboard" = "❌ اقفل الكيبورد" | ||||||
| "cancel" = "❌ إلغاء" | "cancel" = "❌ إلغاء" | ||||||
|  | @ -695,6 +698,7 @@ | ||||||
| "limitTraffic" = "🚧 حد الترافيك" | "limitTraffic" = "🚧 حد الترافيك" | ||||||
| "getBanLogs" = "احصل على سجلات الحظر" | "getBanLogs" = "احصل على سجلات الحظر" | ||||||
| "allClients" = "كل العملاء" | "allClients" = "كل العملاء" | ||||||
|  | 
 | ||||||
| "addClient" = "إضافة عميل" | "addClient" = "إضافة عميل" | ||||||
| "submitDisable" = "إرسال كمعطّل ☑️" | "submitDisable" = "إرسال كمعطّل ☑️" | ||||||
| "submitEnable" = "إرسال كمفعّل ✅" | "submitEnable" = "إرسال كمفعّل ✅" | ||||||
|  | @ -706,6 +710,7 @@ | ||||||
| "ResetAllTraffics" = "إعادة ضبط جميع الترافيك" | "ResetAllTraffics" = "إعادة ضبط جميع الترافيك" | ||||||
| "SortedTrafficUsageReport" = "تقرير استخدام الترافيك المرتب" | "SortedTrafficUsageReport" = "تقرير استخدام الترافيك المرتب" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ العملية نجحت!" | "successfulOperation" = "✅ العملية نجحت!" | ||||||
| "errorOperation" = "❗ حصل خطأ في العملية." | "errorOperation" = "❗ حصل خطأ في العملية." | ||||||
|  |  | ||||||
|  | @ -258,7 +258,7 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "Traffic has been reset." | "resetInboundClientTrafficSuccess" = "Traffic has been reset." | ||||||
| "trafficGetError" = "Error getting traffics." | "trafficGetError" = "Error getting traffics." | ||||||
| "getNewX25519CertError" = "Error while obtaining the X25519 certificate." | "getNewX25519CertError" = "Error while obtaining the X25519 certificate." | ||||||
| "getNewmldsa65Error" = "Error while obtaining mldsa65." | 
 | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "Request" | "request" = "Request" | ||||||
|  | @ -643,6 +643,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 Refreshed On: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 Refreshed On: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ Yes" | "yes" = "✅ Yes" | ||||||
| "no" = "❌ No" | "no" = "❌ No" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID updated." | "received_id" = "🔑📥 ID updated." | ||||||
| "received_password" = "🔑📥 Password updated." | "received_password" = "🔑📥 Password updated." | ||||||
| "received_email" = "📧📥 Email updated." | "received_email" = "📧📥 Email updated." | ||||||
|  | @ -662,6 +663,7 @@ | ||||||
| "FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Result: ❌ Failed \n\n🛠️ Error: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Result: ❌ Failed \n\n🛠️ Error: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 Traffic reset process finished for all clients." | "FinishProcess" = "🔚 Traffic reset process finished for all clients." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ Close Keyboard" | "closeKeyboard" = "❌ Close Keyboard" | ||||||
| "cancel" = "❌ Cancel" | "cancel" = "❌ Cancel" | ||||||
|  | @ -695,6 +697,7 @@ | ||||||
| "limitTraffic" = "🚧 Traffic Limit" | "limitTraffic" = "🚧 Traffic Limit" | ||||||
| "getBanLogs" = "Get Ban Logs" | "getBanLogs" = "Get Ban Logs" | ||||||
| "allClients" = "All Clients" | "allClients" = "All Clients" | ||||||
|  | 
 | ||||||
| "addClient" = "Add Client" | "addClient" = "Add Client" | ||||||
| "submitDisable" = "Submit As Disable ☑️" | "submitDisable" = "Submit As Disable ☑️" | ||||||
| "submitEnable" = "Submit As Enable ✅" | "submitEnable" = "Submit As Enable ✅" | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "Tiempo de Funcionamiento" | "operationHours" = "Tiempo de Funcionamiento" | ||||||
| "systemLoad" = "Carga del Sistema" | "systemLoad" = "Carga del Sistema" | ||||||
| "systemLoadDesc" = "promedio de carga del sistema en los últimos 1, 5 y 15 minutos" | "systemLoadDesc" = "promedio de carga del sistema en los últimos 1, 5 y 15 minutos" | ||||||
|  | "connectionTcpCountDesc" = "Conexiones TCP totales en todas las tarjetas de red." | ||||||
|  | "connectionUdpCountDesc" = "Conexiones UDP totales en todas las tarjetas de red." | ||||||
| "connectionCount" = "Número de Conexiones" | "connectionCount" = "Número de Conexiones" | ||||||
| "ipAddresses" = "Direcciones IP" | "ipAddresses" = "Direcciones IP" | ||||||
| "toggleIpVisibility" = "Alternar visibilidad de la IP" | "toggleIpVisibility" = "Alternar visibilidad de la IP" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "Eliminar cliente" | "deleteClient" = "Eliminar cliente" | ||||||
| "deleteClientContent" = "¿Está seguro de que desea eliminar el cliente?" | "deleteClientContent" = "¿Está seguro de que desea eliminar el cliente?" | ||||||
| "resetTrafficContent" = "¿Confirmar restablecimiento de tráfico?" | "resetTrafficContent" = "¿Confirmar restablecimiento de tráfico?" | ||||||
|  | "inboundUpdateSuccess" = "La entrada se ha actualizado correctamente." | ||||||
|  | "inboundCreateSuccess" = "La entrada se ha creado correctamente." | ||||||
| "copyLink" = "Copiar Enlace" | "copyLink" = "Copiar Enlace" | ||||||
| "address" = "Dirección" | "address" = "Dirección" | ||||||
| "network" = "Red" | "network" = "Red" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado" | "resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado" | ||||||
| "trafficGetError" = "Error al obtener los tráficos" | "trafficGetError" = "Error al obtener los tráficos" | ||||||
| "getNewX25519CertError" = "Error al obtener el certificado X25519." | "getNewX25519CertError" = "Error al obtener el certificado X25519." | ||||||
| "getNewmldsa65Error" = "Error al obtener el certificado mldsa65." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "Pedido" | "request" = "Pedido" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 Actualizado en: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 Actualizado en: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ Sí" | "yes" = "✅ Sí" | ||||||
| "no" = "❌ No" | "no" = "❌ No" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID actualizado." | "received_id" = "🔑📥 ID actualizado." | ||||||
| "received_password" = "🔑📥 Contraseña actualizada." | "received_password" = "🔑📥 Contraseña actualizada." | ||||||
| "received_email" = "📧📥 Correo electrónico actualizado." | "received_email" = "📧📥 Correo electrónico actualizado." | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 Correo: {{ .ClientEmail }}\n🏁 Resultado: ❌ Fallido \n\n🛠️ Error: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 Correo: {{ .ClientEmail }}\n🏁 Resultado: ❌ Fallido \n\n🛠️ Error: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 Proceso de reinicio de tráfico finalizado para todos los clientes." | "FinishProcess" = "🔚 Proceso de reinicio de tráfico finalizado para todos los clientes." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ Cerrar Teclado" | "closeKeyboard" = "❌ Cerrar Teclado" | ||||||
| "cancel" = "❌ Cancelar" | "cancel" = "❌ Cancelar" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 Límite de tráfico" | "limitTraffic" = "🚧 Límite de tráfico" | ||||||
| "getBanLogs" = "Registros de prohibición" | "getBanLogs" = "Registros de prohibición" | ||||||
| "allClients" = "Todos los Clientes" | "allClients" = "Todos los Clientes" | ||||||
|  | 
 | ||||||
| "addClient" = "Añadir cliente" | "addClient" = "Añadir cliente" | ||||||
| "submitDisable" = "Enviar como deshabilitado ☑️" | "submitDisable" = "Enviar como deshabilitado ☑️" | ||||||
| "submitEnable" = "Enviar como habilitado ✅" | "submitEnable" = "Enviar como habilitado ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "Reiniciar todo el tráfico" | "ResetAllTraffics" = "Reiniciar todo el tráfico" | ||||||
| "SortedTrafficUsageReport" = "Informe de uso de tráfico ordenado" | "SortedTrafficUsageReport" = "Informe de uso de tráfico ordenado" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ ¡Exitosa!" | "successfulOperation" = "✅ ¡Exitosa!" | ||||||
| "errorOperation" = "❗ Error en la Operación." | "errorOperation" = "❗ Error en la Operación." | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "مدتکارکرد" | "operationHours" = "مدتکارکرد" | ||||||
| "systemLoad" = "بارسیستم" | "systemLoad" = "بارسیستم" | ||||||
| "systemLoadDesc" = "میانگین بار سیستم برای 1، 5 و 15 دقیقه گذشته" | "systemLoadDesc" = "میانگین بار سیستم برای 1، 5 و 15 دقیقه گذشته" | ||||||
|  | "connectionTcpCountDesc" = "در تمامشبکهها TCP مجموعاتصالات" | ||||||
|  | "connectionUdpCountDesc" = "در تمامشبکهها UDP مجموعاتصالات" | ||||||
| "connectionCount" = "تعداد کانکشن ها" | "connectionCount" = "تعداد کانکشن ها" | ||||||
| "ipAddresses" = "آدرسهای IP" | "ipAddresses" = "آدرسهای IP" | ||||||
| "toggleIpVisibility" = "تغییر وضعیت نمایش IP" | "toggleIpVisibility" = "تغییر وضعیت نمایش IP" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "حذف کاربر" | "deleteClient" = "حذف کاربر" | ||||||
| "deleteClientContent" = "آیا مطمئن به حذف کاربر هستید؟" | "deleteClientContent" = "آیا مطمئن به حذف کاربر هستید؟" | ||||||
| "resetTrafficContent" = "آیا مطمئن به ریست ترافیک هستید؟" | "resetTrafficContent" = "آیا مطمئن به ریست ترافیک هستید؟" | ||||||
|  | "inboundUpdateSuccess" = "ورودی با موفقیت بهروزرسانی شد." | ||||||
|  | "inboundCreateSuccess" = "ورودی با موفقیت ایجاد شد." | ||||||
| "copyLink" = "کپی لینک" | "copyLink" = "کپی لینک" | ||||||
| "address" = "آدرس" | "address" = "آدرس" | ||||||
| "network" = "شبکه" | "network" = "شبکه" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد" | "resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد" | ||||||
| "trafficGetError" = "خطا در دریافت ترافیکها" | "trafficGetError" = "خطا در دریافت ترافیکها" | ||||||
| "getNewX25519CertError" = "خطا در دریافت گواهی X25519." | "getNewX25519CertError" = "خطا در دریافت گواهی X25519." | ||||||
| "getNewmldsa65Error" = "خطا در دریافت گواهی mldsa65." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "درخواست" | "request" = "درخواست" | ||||||
|  | @ -355,16 +358,16 @@ | ||||||
| "subDomainDesc" = "آدرس دامنه برای سرویس سابسکریپشن. برای گوش دادن به تمام دامنهها و آیپیها خالیبگذارید" | "subDomainDesc" = "آدرس دامنه برای سرویس سابسکریپشن. برای گوش دادن به تمام دامنهها و آیپیها خالیبگذارید" | ||||||
| "subUpdates" = "فاصله بروزرسانی سابسکریپشن" | "subUpdates" = "فاصله بروزرسانی سابسکریپشن" | ||||||
| "subUpdatesDesc" = "(فاصله مابین بروزرسانی در برنامههای کاربری. (واحد: ساعت" | "subUpdatesDesc" = "(فاصله مابین بروزرسانی در برنامههای کاربری. (واحد: ساعت" | ||||||
|  | "externalTrafficInformEnable" = "اطلاع رسانی خارجی مصرف ترافیک" | ||||||
|  | "externalTrafficInformEnableDesc" = "مصرف ترافیک به سرویس خارجی ارسال می شود" | ||||||
|  | "externalTrafficInformURI" = "لینک اطلاع رسانی خارجی مصرف ترافیک" | ||||||
|  | "externalTrafficInformURIDesc" = "ترافیک های مصرفی به این لینک هم ارسال می شود" | ||||||
| "subEncrypt" = "کدگذاری" | "subEncrypt" = "کدگذاری" | ||||||
| "subEncryptDesc" = "کدگذاری خواهدشد Base64 محتوای برگشتی سرویس سابسکریپشن برپایه" | "subEncryptDesc" = "کدگذاری خواهدشد Base64 محتوای برگشتی سرویس سابسکریپشن برپایه" | ||||||
| "subShowInfo" = "نمایش اطلاعات مصرف" | "subShowInfo" = "نمایش اطلاعات مصرف" | ||||||
| "subShowInfoDesc" = "ترافیک و زمان باقیمانده را در برنامههای کاربری نمایش میدهد" | "subShowInfoDesc" = "ترافیک و زمان باقیمانده را در برنامههای کاربری نمایش میدهد" | ||||||
| "subURI" = "پروکسی معکوس URI مسیر" | "subURI" = "پروکسی معکوس URI مسیر" | ||||||
| "subURIDesc" = "سابسکریپشن را برای استفاده در پشت پراکسیها تغییر میدهد URI مسیر" | "subURIDesc" = "سابسکریپشن را برای استفاده در پشت پراکسیها تغییر میدهد URI مسیر" | ||||||
| "externalTrafficInformEnable" = "اطلاع رسانی خارجی مصرف ترافیک" |  | ||||||
| "externalTrafficInformEnableDesc" = "مصرف ترافیک به سرویس خارجی ارسال می شود" |  | ||||||
| "externalTrafficInformURI" = "لینک اطلاع رسانی خارجی مصرف ترافیک" |  | ||||||
| "externalTrafficInformURIDesc" = "ترافیک های مصرفی به این لینک هم ارسال می شود" |  | ||||||
| "fragment" = "فرگمنت" | "fragment" = "فرگمنت" | ||||||
| "fragmentDesc" = "فعال کردن فرگمنت برای بستهی نخست تیالاس" | "fragmentDesc" = "فعال کردن فرگمنت برای بستهی نخست تیالاس" | ||||||
| "fragmentSett" = "تنظیمات فرگمنت" | "fragmentSett" = "تنظیمات فرگمنت" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 تازهسازی شده در: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 تازهسازی شده در: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ بله" | "yes" = "✅ بله" | ||||||
| "no" = "❌ خیر" | "no" = "❌ خیر" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 شناسه بهروزرسانی شد." | "received_id" = "🔑📥 شناسه بهروزرسانی شد." | ||||||
| "received_password" = "🔑📥 رمز عبور بهروزرسانی شد." | "received_password" = "🔑📥 رمز عبور بهروزرسانی شد." | ||||||
| "received_email" = "📧📥 ایمیل بهروزرسانی شد." | "received_email" = "📧📥 ایمیل بهروزرسانی شد." | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 ایمیل: {{ .ClientEmail }}\n🏁 نتیجه: ❌ ناموفق \n\n🛠️ خطا: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 ایمیل: {{ .ClientEmail }}\n🏁 نتیجه: ❌ ناموفق \n\n🛠️ خطا: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 فرآیند بازنشانی ترافیک برای همه مشتریان به پایان رسید." | "FinishProcess" = "🔚 فرآیند بازنشانی ترافیک برای همه مشتریان به پایان رسید." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ بستن کیبورد" | "closeKeyboard" = "❌ بستن کیبورد" | ||||||
| "cancel" = "❌ لغو" | "cancel" = "❌ لغو" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 محدودیت ترافیک" | "limitTraffic" = "🚧 محدودیت ترافیک" | ||||||
| "getBanLogs" = "گزارش های بلوک را دریافت کنید" | "getBanLogs" = "گزارش های بلوک را دریافت کنید" | ||||||
| "allClients" = "همه مشتریان" | "allClients" = "همه مشتریان" | ||||||
|  | 
 | ||||||
| "addClient" = "افزودن مشتری" | "addClient" = "افزودن مشتری" | ||||||
| "submitDisable" = "ارسال به عنوان غیرفعال ☑️" | "submitDisable" = "ارسال به عنوان غیرفعال ☑️" | ||||||
| "submitEnable" = "ارسال به عنوان فعال ✅" | "submitEnable" = "ارسال به عنوان فعال ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "بازنشانی همه ترافیکها" | "ResetAllTraffics" = "بازنشانی همه ترافیکها" | ||||||
| "SortedTrafficUsageReport" = "گزارش استفاده از ترافیک مرتبشده" | "SortedTrafficUsageReport" = "گزارش استفاده از ترافیک مرتبشده" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ انجام شد!" | "successfulOperation" = "✅ انجام شد!" | ||||||
| "errorOperation" = "❗ خطا در عملیات." | "errorOperation" = "❗ خطا در عملیات." | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "Waktu Aktif" | "operationHours" = "Waktu Aktif" | ||||||
| "systemLoad" = "Beban Sistem" | "systemLoad" = "Beban Sistem" | ||||||
| "systemLoadDesc" = "Rata-rata beban sistem selama 1, 5, dan 15 menit terakhir" | "systemLoadDesc" = "Rata-rata beban sistem selama 1, 5, dan 15 menit terakhir" | ||||||
|  | "connectionTcpCountDesc" = "Total koneksi TCP di seluruh sistem" | ||||||
|  | "connectionUdpCountDesc" = "Total koneksi UDP di seluruh sistem" | ||||||
| "connectionCount" = "Statistik Koneksi" | "connectionCount" = "Statistik Koneksi" | ||||||
| "ipAddresses" = "Alamat IP" | "ipAddresses" = "Alamat IP" | ||||||
| "toggleIpVisibility" = "Alihkan visibilitas IP" | "toggleIpVisibility" = "Alihkan visibilitas IP" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "Hapus Klien" | "deleteClient" = "Hapus Klien" | ||||||
| "deleteClientContent" = "Apakah Anda yakin ingin menghapus klien?" | "deleteClientContent" = "Apakah Anda yakin ingin menghapus klien?" | ||||||
| "resetTrafficContent" = "Apakah Anda yakin ingin mereset traffic?" | "resetTrafficContent" = "Apakah Anda yakin ingin mereset traffic?" | ||||||
|  | "inboundUpdateSuccess" = "Inbound berhasil diperbarui." | ||||||
|  | "inboundCreateSuccess" = "Inbound berhasil dibuat." | ||||||
| "copyLink" = "Salin URL" | "copyLink" = "Salin URL" | ||||||
| "address" = "Alamat" | "address" = "Alamat" | ||||||
| "network" = "Jaringan" | "network" = "Jaringan" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "Lalu lintas telah direset" | "resetInboundClientTrafficSuccess" = "Lalu lintas telah direset" | ||||||
| "trafficGetError" = "Gagal mendapatkan data lalu lintas" | "trafficGetError" = "Gagal mendapatkan data lalu lintas" | ||||||
| "getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519." | "getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519." | ||||||
| "getNewmldsa65Error" = "Terjadi kesalahan saat mendapatkan sertifikat mldsa65." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "Permintaan" | "request" = "Permintaan" | ||||||
|  | @ -418,6 +421,7 @@ | ||||||
| "RoutingStrategy" = "Strategi Pengalihan Keseluruhan" | "RoutingStrategy" = "Strategi Pengalihan Keseluruhan" | ||||||
| "RoutingStrategyDesc" = "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan." | "RoutingStrategyDesc" = "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan." | ||||||
| "Torrent" = "Blokir Protokol BitTorrent" | "Torrent" = "Blokir Protokol BitTorrent" | ||||||
|  | "TorrentDesc" = "Memblokir protokol BitTorrent." | ||||||
| "Inbounds" = "Masuk" | "Inbounds" = "Masuk" | ||||||
| "InboundsDesc" = "Menerima klien tertentu." | "InboundsDesc" = "Menerima klien tertentu." | ||||||
| "Outbounds" = "Keluar" | "Outbounds" = "Keluar" | ||||||
|  | @ -643,6 +647,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 Diperbarui Pada: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 Diperbarui Pada: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ Ya" | "yes" = "✅ Ya" | ||||||
| "no" = "❌ Tidak" | "no" = "❌ Tidak" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID diperbarui." | "received_id" = "🔑📥 ID diperbarui." | ||||||
| "received_password" = "🔑📥 Kata sandi diperbarui." | "received_password" = "🔑📥 Kata sandi diperbarui." | ||||||
| "received_email" = "📧📥 Email diperbarui." | "received_email" = "📧📥 Email diperbarui." | ||||||
|  | @ -662,6 +667,7 @@ | ||||||
| "FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ❌ Gagal \n\n🛠️ Kesalahan: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Hasil: ❌ Gagal \n\n🛠️ Kesalahan: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 Proses reset traffic selesai untuk semua klien." | "FinishProcess" = "🔚 Proses reset traffic selesai untuk semua klien." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ Tutup Papan Ketik" | "closeKeyboard" = "❌ Tutup Papan Ketik" | ||||||
| "cancel" = "❌ Batal" | "cancel" = "❌ Batal" | ||||||
|  | @ -695,6 +701,7 @@ | ||||||
| "limitTraffic" = "🚧 Batas Lalu Lintas" | "limitTraffic" = "🚧 Batas Lalu Lintas" | ||||||
| "getBanLogs" = "Dapatkan Log Pemblokiran" | "getBanLogs" = "Dapatkan Log Pemblokiran" | ||||||
| "allClients" = "Semua Klien" | "allClients" = "Semua Klien" | ||||||
|  | 
 | ||||||
| "addClient" = "Tambah Klien" | "addClient" = "Tambah Klien" | ||||||
| "submitDisable" = "Kirim Sebagai Nonaktif ☑️" | "submitDisable" = "Kirim Sebagai Nonaktif ☑️" | ||||||
| "submitEnable" = "Kirim Sebagai Aktif ✅" | "submitEnable" = "Kirim Sebagai Aktif ✅" | ||||||
|  | @ -706,6 +713,7 @@ | ||||||
| "ResetAllTraffics" = "Reset Semua Lalu Lintas" | "ResetAllTraffics" = "Reset Semua Lalu Lintas" | ||||||
| "SortedTrafficUsageReport" = "Laporan Penggunaan Lalu Lintas yang Terurut" | "SortedTrafficUsageReport" = "Laporan Penggunaan Lalu Lintas yang Terurut" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ Operasi berhasil!" | "successfulOperation" = "✅ Operasi berhasil!" | ||||||
| "errorOperation" = "❗ Kesalahan dalam operasi." | "errorOperation" = "❗ Kesalahan dalam operasi." | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "システム稼働時間" | "operationHours" = "システム稼働時間" | ||||||
| "systemLoad" = "システム負荷" | "systemLoad" = "システム負荷" | ||||||
| "systemLoadDesc" = "過去1、5、15分間のシステム平均負荷" | "systemLoadDesc" = "過去1、5、15分間のシステム平均負荷" | ||||||
|  | "connectionTcpCountDesc" = "システム内のすべてのTCP接続数" | ||||||
|  | "connectionUdpCountDesc" = "システム内のすべてのUDP接続数" | ||||||
| "connectionCount" = "接続数" | "connectionCount" = "接続数" | ||||||
| "ipAddresses" = "IPアドレス" | "ipAddresses" = "IPアドレス" | ||||||
| "toggleIpVisibility" = "IPの表示を切り替える" | "toggleIpVisibility" = "IPの表示を切り替える" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "クライアント削除" | "deleteClient" = "クライアント削除" | ||||||
| "deleteClientContent" = "クライアントを削除してもよろしいですか?" | "deleteClientContent" = "クライアントを削除してもよろしいですか?" | ||||||
| "resetTrafficContent" = "トラフィックをリセットしてもよろしいですか?" | "resetTrafficContent" = "トラフィックをリセットしてもよろしいですか?" | ||||||
|  | "inboundUpdateSuccess" = "インバウンドが正常に更新されました。" | ||||||
|  | "inboundCreateSuccess" = "インバウンドが正常に作成されました。" | ||||||
| "copyLink" = "リンクをコピー" | "copyLink" = "リンクをコピー" | ||||||
| "address" = "アドレス" | "address" = "アドレス" | ||||||
| "network" = "ネットワーク" | "network" = "ネットワーク" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "トラフィックがリセットされました" | "resetInboundClientTrafficSuccess" = "トラフィックがリセットされました" | ||||||
| "trafficGetError" = "トラフィックの取得中にエラーが発生しました" | "trafficGetError" = "トラフィックの取得中にエラーが発生しました" | ||||||
| "getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。" | "getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。" | ||||||
| "getNewmldsa65Error" = "mldsa65証明書の取得中にエラーが発生しました。" |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "リクエスト" | "request" = "リクエスト" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 更新時間:{{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 更新時間:{{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ はい" | "yes" = "✅ はい" | ||||||
| "no" = "❌ いいえ" | "no" = "❌ いいえ" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 IDが更新されました。" | "received_id" = "🔑📥 IDが更新されました。" | ||||||
| "received_password" = "🔑📥 パスワードが更新されました。" | "received_password" = "🔑📥 パスワードが更新されました。" | ||||||
| "received_email" = "📧📥 メールが更新されました。" | "received_email" = "📧📥 メールが更新されました。" | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 メール: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ エラー: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 メール: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ エラー: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 すべてのクライアントのトラフィックリセットが完了しました。" | "FinishProcess" = "🔚 すべてのクライアントのトラフィックリセットが完了しました。" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ キーボードを閉じる" | "closeKeyboard" = "❌ キーボードを閉じる" | ||||||
| "cancel" = "❌ キャンセル" | "cancel" = "❌ キャンセル" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 トラフィック制限" | "limitTraffic" = "🚧 トラフィック制限" | ||||||
| "getBanLogs" = "禁止ログ" | "getBanLogs" = "禁止ログ" | ||||||
| "allClients" = "すべてのクライアント" | "allClients" = "すべてのクライアント" | ||||||
|  | 
 | ||||||
| "addClient" = "クライアントを追加" | "addClient" = "クライアントを追加" | ||||||
| "submitDisable" = "無効として送信 ☑️" | "submitDisable" = "無効として送信 ☑️" | ||||||
| "submitEnable" = "有効として送信 ✅" | "submitEnable" = "有効として送信 ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "すべてのトラフィックをリセット" | "ResetAllTraffics" = "すべてのトラフィックをリセット" | ||||||
| "SortedTrafficUsageReport" = "ソートされたトラフィック使用レポート" | "SortedTrafficUsageReport" = "ソートされたトラフィック使用レポート" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ 成功!" | "successfulOperation" = "✅ 成功!" | ||||||
| "errorOperation" = "❗ 操作エラー。" | "errorOperation" = "❗ 操作エラー。" | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "Tempo de Atividade" | "operationHours" = "Tempo de Atividade" | ||||||
| "systemLoad" = "Carga do Sistema" | "systemLoad" = "Carga do Sistema" | ||||||
| "systemLoadDesc" = "Média de carga do sistema nos últimos 1, 5 e 15 minutos" | "systemLoadDesc" = "Média de carga do sistema nos últimos 1, 5 e 15 minutos" | ||||||
|  | "connectionTcpCountDesc" = "Total de conexões TCP no sistema" | ||||||
|  | "connectionUdpCountDesc" = "Total de conexões UDP no sistema" | ||||||
| "connectionCount" = "Estatísticas de Conexão" | "connectionCount" = "Estatísticas de Conexão" | ||||||
| "ipAddresses" = "Endereços IP" | "ipAddresses" = "Endereços IP" | ||||||
| "toggleIpVisibility" = "Alternar visibilidade do IP" | "toggleIpVisibility" = "Alternar visibilidade do IP" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "Excluir Cliente" | "deleteClient" = "Excluir Cliente" | ||||||
| "deleteClientContent" = "Tem certeza de que deseja excluir o cliente?" | "deleteClientContent" = "Tem certeza de que deseja excluir o cliente?" | ||||||
| "resetTrafficContent" = "Tem certeza de que deseja redefinir o tráfego?" | "resetTrafficContent" = "Tem certeza de que deseja redefinir o tráfego?" | ||||||
|  | "inboundUpdateSuccess" = "A entrada foi atualizada com sucesso." | ||||||
|  | "inboundCreateSuccess" = "A entrada foi criada com sucesso." | ||||||
| "copyLink" = "Copiar URL" | "copyLink" = "Copiar URL" | ||||||
| "address" = "Endereço" | "address" = "Endereço" | ||||||
| "network" = "Rede" | "network" = "Rede" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado" | "resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado" | ||||||
| "trafficGetError" = "Erro ao obter tráfegos" | "trafficGetError" = "Erro ao obter tráfegos" | ||||||
| "getNewX25519CertError" = "Erro ao obter o certificado X25519." | "getNewX25519CertError" = "Erro ao obter o certificado X25519." | ||||||
| "getNewmldsa65Error" = "Erro ao obter o certificado mldsa65." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "Requisição" | "request" = "Requisição" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 Atualizado em: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 Atualizado em: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ Sim" | "yes" = "✅ Sim" | ||||||
| "no" = "❌ Não" | "no" = "❌ Não" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID atualizado." | "received_id" = "🔑📥 ID atualizado." | ||||||
| "received_password" = "🔑📥 Senha atualizada." | "received_password" = "🔑📥 Senha atualizada." | ||||||
| "received_email" = "📧📥 E-mail atualizado." | "received_email" = "📧📥 E-mail atualizado." | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ❌ Falhou \n\n🛠️ Erro: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ❌ Falhou \n\n🛠️ Erro: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 Processo de redefinição de tráfego concluído para todos os clientes." | "FinishProcess" = "🔚 Processo de redefinição de tráfego concluído para todos os clientes." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ Fechar teclado" | "closeKeyboard" = "❌ Fechar teclado" | ||||||
| "cancel" = "❌ Cancelar" | "cancel" = "❌ Cancelar" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 Limite de tráfego" | "limitTraffic" = "🚧 Limite de tráfego" | ||||||
| "getBanLogs" = "Obter logs de banimento" | "getBanLogs" = "Obter logs de banimento" | ||||||
| "allClients" = "Todos os clientes" | "allClients" = "Todos os clientes" | ||||||
|  | 
 | ||||||
| "addClient" = "Adicionar Cliente" | "addClient" = "Adicionar Cliente" | ||||||
| "submitDisable" = "Enviar como Desativado ☑️" | "submitDisable" = "Enviar como Desativado ☑️" | ||||||
| "submitEnable" = "Enviar como Ativado ✅" | "submitEnable" = "Enviar como Ativado ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "Redefinir Todo o Tráfego" | "ResetAllTraffics" = "Redefinir Todo o Tráfego" | ||||||
| "SortedTrafficUsageReport" = "Relatório de Uso de Tráfego Ordenado" | "SortedTrafficUsageReport" = "Relatório de Uso de Tráfego Ordenado" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ Operação bem-sucedida!" | "successfulOperation" = "✅ Operação bem-sucedida!" | ||||||
| "errorOperation" = "❗ Erro na operação." | "errorOperation" = "❗ Erro na operação." | ||||||
|  |  | ||||||
|  | @ -84,7 +84,7 @@ | ||||||
| 
 | 
 | ||||||
| [pages.login] | [pages.login] | ||||||
| "hello" = "Привет!" | "hello" = "Привет!" | ||||||
| "title" = "Приветствие!" | "title" = "Добро пожаловать!" | ||||||
| "loginAgain" = "Сессия истекла. Войдите в систему снова" | "loginAgain" = "Сессия истекла. Войдите в систему снова" | ||||||
| 
 | 
 | ||||||
| [pages.login.toasts] | [pages.login.toasts] | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "Время работы системы" | "operationHours" = "Время работы системы" | ||||||
| "systemLoad" = "Нагрузка на систему" | "systemLoad" = "Нагрузка на систему" | ||||||
| "systemLoadDesc" = "Средняя загрузка системы за последние 1, 5 и 15 минут" | "systemLoadDesc" = "Средняя загрузка системы за последние 1, 5 и 15 минут" | ||||||
|  | "connectionTcpCountDesc" = "Общее количество подключений TCP по всем сетевым картам." | ||||||
|  | "connectionUdpCountDesc" = "Общее количество подключений UDP по всем сетевым картам." | ||||||
| "connectionCount" = "Количество соединений" | "connectionCount" = "Количество соединений" | ||||||
| "ipAddresses" = "IP-адреса сервера" | "ipAddresses" = "IP-адреса сервера" | ||||||
| "toggleIpVisibility" = "Переключить видимость IP-адресов сервера" | "toggleIpVisibility" = "Переключить видимость IP-адресов сервера" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "Удалить клиента" | "deleteClient" = "Удалить клиента" | ||||||
| "deleteClientContent" = "Вы уверены, что хотите удалить клиента?" | "deleteClientContent" = "Вы уверены, что хотите удалить клиента?" | ||||||
| "resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?" | "resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?" | ||||||
|  | "inboundUpdateSuccess" = "Инбаунд успешно обновлен." | ||||||
|  | "inboundCreateSuccess" = "Инбаунд успешно создан." | ||||||
| "copyLink" = "Копировать ссылку" | "copyLink" = "Копировать ссылку" | ||||||
| "address" = "Адрес" | "address" = "Адрес" | ||||||
| "network" = "Сеть" | "network" = "Сеть" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "Трафик сброшен" | "resetInboundClientTrafficSuccess" = "Трафик сброшен" | ||||||
| "trafficGetError" = "Ошибка получения данных о трафике" | "trafficGetError" = "Ошибка получения данных о трафике" | ||||||
| "getNewX25519CertError" = "Ошибка при получении сертификата X25519." | "getNewX25519CertError" = "Ошибка при получении сертификата X25519." | ||||||
| "getNewmldsa65Error" = "Ошибка при получении сертификата mldsa65." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "Запрос" | "request" = "Запрос" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 Обновлено: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 Обновлено: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ Да" | "yes" = "✅ Да" | ||||||
| "no" = "❌ Нет" | "no" = "❌ Нет" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID обновлён." | "received_id" = "🔑📥 ID обновлён." | ||||||
| "received_password" = "🔑📥 Пароль обновлён." | "received_password" = "🔑📥 Пароль обновлён." | ||||||
| "received_email" = "📧📥 Email обновлен." | "received_email" = "📧📥 Email обновлен." | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 Почта: {{ .ClientEmail }}\n🏁 Результат: ❌ Неудача \n\n🛠️ Ошибка: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 Почта: {{ .ClientEmail }}\n🏁 Результат: ❌ Неудача \n\n🛠️ Ошибка: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 Сброс трафика завершён для всех клиентов." | "FinishProcess" = "🔚 Сброс трафика завершён для всех клиентов." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ Закрыть клавиатуру" | "closeKeyboard" = "❌ Закрыть клавиатуру" | ||||||
| "cancel" = "❌ Отмена" | "cancel" = "❌ Отмена" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 Лимит трафика" | "limitTraffic" = "🚧 Лимит трафика" | ||||||
| "getBanLogs" = "📄 Лог банов" | "getBanLogs" = "📄 Лог банов" | ||||||
| "allClients" = "👥 Все клиенты" | "allClients" = "👥 Все клиенты" | ||||||
|  | 
 | ||||||
| "addClient" = "➕ Новый клиент" | "addClient" = "➕ Новый клиент" | ||||||
| "submitDisable" = "Добавить отключенным ☑️" | "submitDisable" = "Добавить отключенным ☑️" | ||||||
| "submitEnable" = "Добавить включенныи ✅" | "submitEnable" = "Добавить включенныи ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "Сбросить весь трафик" | "ResetAllTraffics" = "Сбросить весь трафик" | ||||||
| "SortedTrafficUsageReport" = "Отсортированный отчет об использовании трафика" | "SortedTrafficUsageReport" = "Отсортированный отчет об использовании трафика" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ Успешно!" | "successfulOperation" = "✅ Успешно!" | ||||||
| "errorOperation" = "❗ Ошибка в операции." | "errorOperation" = "❗ Ошибка в операции." | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "Çalışma Süresi" | "operationHours" = "Çalışma Süresi" | ||||||
| "systemLoad" = "Sistem Yükü" | "systemLoad" = "Sistem Yükü" | ||||||
| "systemLoadDesc" = "Geçmiş 1, 5 ve 15 dakika için sistem yük ortalaması" | "systemLoadDesc" = "Geçmiş 1, 5 ve 15 dakika için sistem yük ortalaması" | ||||||
|  | "connectionTcpCountDesc" = "Sistem genelinde toplam TCP bağlantıları" | ||||||
|  | "connectionUdpCountDesc" = "Sistem genelinde toplam UDP bağlantıları" | ||||||
| "connectionCount" = "Bağlantı İstatistikleri" | "connectionCount" = "Bağlantı İstatistikleri" | ||||||
| "ipAddresses" = "IP adresleri" | "ipAddresses" = "IP adresleri" | ||||||
| "toggleIpVisibility" = "IP görünürlüğünü değiştir" | "toggleIpVisibility" = "IP görünürlüğünü değiştir" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "Müşteriyi Sil" | "deleteClient" = "Müşteriyi Sil" | ||||||
| "deleteClientContent" = "Müşteriyi silmek istediğinizden emin misiniz?" | "deleteClientContent" = "Müşteriyi silmek istediğinizden emin misiniz?" | ||||||
| "resetTrafficContent" = "Trafiği sıfırlamak istediğinizden emin misiniz?" | "resetTrafficContent" = "Trafiği sıfırlamak istediğinizden emin misiniz?" | ||||||
|  | "inboundUpdateSuccess" = "Gelen bağlantı başarıyla güncellendi." | ||||||
|  | "inboundCreateSuccess" = "Gelen bağlantı başarıyla oluşturuldu." | ||||||
| "copyLink" = "URL'yi Kopyala" | "copyLink" = "URL'yi Kopyala" | ||||||
| "address" = "Adres" | "address" = "Adres" | ||||||
| "network" = "Ağ" | "network" = "Ağ" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "Trafik sıfırlandı" | "resetInboundClientTrafficSuccess" = "Trafik sıfırlandı" | ||||||
| "trafficGetError" = "Trafik bilgisi alınırken hata oluştu" | "trafficGetError" = "Trafik bilgisi alınırken hata oluştu" | ||||||
| "getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu." | "getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu." | ||||||
| "getNewmldsa65Error" = "mldsa65 sertifikası alınırken hata oluştu." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "İstek" | "request" = "İstek" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 Yenilendi: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ Evet" | "yes" = "✅ Evet" | ||||||
| "no" = "❌ Hayır" | "no" = "❌ Hayır" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 Kimlik güncellendi." | "received_id" = "🔑📥 Kimlik güncellendi." | ||||||
| "received_password" = "🔑📥 Şifre güncellendi." | "received_password" = "🔑📥 Şifre güncellendi." | ||||||
| "received_email" = "📧📥 E-posta güncellendi." | "received_email" = "📧📥 E-posta güncellendi." | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ❌ Başarısız \n\n🛠️ Hata: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 E-posta: {{ .ClientEmail }}\n🏁 Sonuç: ❌ Başarısız \n\n🛠️ Hata: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 Tüm müşteriler için trafik sıfırlama işlemi tamamlandı." | "FinishProcess" = "🔚 Tüm müşteriler için trafik sıfırlama işlemi tamamlandı." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ Klavyeyi Kapat" | "closeKeyboard" = "❌ Klavyeyi Kapat" | ||||||
| "cancel" = "❌ İptal" | "cancel" = "❌ İptal" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 Trafik Sınırı" | "limitTraffic" = "🚧 Trafik Sınırı" | ||||||
| "getBanLogs" = "Yasak Günlüklerini Al" | "getBanLogs" = "Yasak Günlüklerini Al" | ||||||
| "allClients" = "Tüm Müşteriler" | "allClients" = "Tüm Müşteriler" | ||||||
|  | 
 | ||||||
| "addClient" = "Müşteri Ekle" | "addClient" = "Müşteri Ekle" | ||||||
| "submitDisable" = "Devre Dışı Olarak Gönder ☑️" | "submitDisable" = "Devre Dışı Olarak Gönder ☑️" | ||||||
| "submitEnable" = "Etkin Olarak Gönder ✅" | "submitEnable" = "Etkin Olarak Gönder ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "Tüm Trafikleri Sıfırla" | "ResetAllTraffics" = "Tüm Trafikleri Sıfırla" | ||||||
| "SortedTrafficUsageReport" = "Sıralı Trafik Kullanım Raporu" | "SortedTrafficUsageReport" = "Sıralı Trafik Kullanım Raporu" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ İşlem başarılı!" | "successfulOperation" = "✅ İşlem başarılı!" | ||||||
| "errorOperation" = "❗ İşlemde hata." | "errorOperation" = "❗ İşlemde hata." | ||||||
|  |  | ||||||
|  | @ -84,7 +84,7 @@ | ||||||
| 
 | 
 | ||||||
| [pages.login] | [pages.login] | ||||||
| "hello" = "Привіт" | "hello" = "Привіт" | ||||||
| "title" = "Привітання!" | "title" = "Ласкаво просимо" | ||||||
| "loginAgain" = "Ваш сеанс закінчився, увійдіть знову" | "loginAgain" = "Ваш сеанс закінчився, увійдіть знову" | ||||||
| 
 | 
 | ||||||
| [pages.login.toasts] | [pages.login.toasts] | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "Час роботи" | "operationHours" = "Час роботи" | ||||||
| "systemLoad" = "Завантаження системи" | "systemLoad" = "Завантаження системи" | ||||||
| "systemLoadDesc" = "Середнє завантаження системи за останні 1, 5 і 15 хвилин" | "systemLoadDesc" = "Середнє завантаження системи за останні 1, 5 і 15 хвилин" | ||||||
|  | "connectionTcpCountDesc" = "Загальна кількість TCP-з'єднань у системі" | ||||||
|  | "connectionUdpCountDesc" = "Загальна кількість UDP-з'єднань у системі" | ||||||
| "connectionCount" = "Статистика з'єднання" | "connectionCount" = "Статистика з'єднання" | ||||||
| "ipAddresses" = "IP-адреси" | "ipAddresses" = "IP-адреси" | ||||||
| "toggleIpVisibility" = "Перемкнути видимість IP" | "toggleIpVisibility" = "Перемкнути видимість IP" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "Видалити клієнта" | "deleteClient" = "Видалити клієнта" | ||||||
| "deleteClientContent" = "Ви впевнені, що хочете видалити клієнт?" | "deleteClientContent" = "Ви впевнені, що хочете видалити клієнт?" | ||||||
| "resetTrafficContent" = "Ви впевнені, що хочете скинути трафік?" | "resetTrafficContent" = "Ви впевнені, що хочете скинути трафік?" | ||||||
|  | "inboundUpdateSuccess" = "Вхідне підключення успішно оновлено." | ||||||
|  | "inboundCreateSuccess" = "Вхідне підключення успішно створено." | ||||||
| "copyLink" = "Копіювати URL" | "copyLink" = "Копіювати URL" | ||||||
| "address" = "Адреса" | "address" = "Адреса" | ||||||
| "network" = "Мережа" | "network" = "Мережа" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "Трафік скинуто" | "resetInboundClientTrafficSuccess" = "Трафік скинуто" | ||||||
| "trafficGetError" = "Помилка отримання даних про трафік" | "trafficGetError" = "Помилка отримання даних про трафік" | ||||||
| "getNewX25519CertError" = "Помилка при отриманні сертифіката X25519." | "getNewX25519CertError" = "Помилка при отриманні сертифіката X25519." | ||||||
| "getNewmldsa65Error" = "Помилка при отриманні сертифіката mldsa65." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "Запит" | "request" = "Запит" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 Оновлено: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 Оновлено: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ Так" | "yes" = "✅ Так" | ||||||
| "no" = "❌ Ні" | "no" = "❌ Ні" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID оновлено." | "received_id" = "🔑📥 ID оновлено." | ||||||
| "received_password" = "🔑📥 Пароль оновлено." | "received_password" = "🔑📥 Пароль оновлено." | ||||||
| "received_email" = "📧📥 Електронна пошта оновлена." | "received_email" = "📧📥 Електронна пошта оновлена." | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 Електронна пошта: {{ .ClientEmail }}\n🏁 Результат: ❌ Невдача \n\n🛠️ Помилка: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 Електронна пошта: {{ .ClientEmail }}\n🏁 Результат: ❌ Невдача \n\n🛠️ Помилка: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 Процес скидання трафіку завершено для всіх клієнтів." | "FinishProcess" = "🔚 Процес скидання трафіку завершено для всіх клієнтів." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ Закрити клавіатуру" | "closeKeyboard" = "❌ Закрити клавіатуру" | ||||||
| "cancel" = "❌ Скасувати" | "cancel" = "❌ Скасувати" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 Ліміт трафіку" | "limitTraffic" = "🚧 Ліміт трафіку" | ||||||
| "getBanLogs" = "Отримати журнали заборон" | "getBanLogs" = "Отримати журнали заборон" | ||||||
| "allClients" = "Всі Клієнти" | "allClients" = "Всі Клієнти" | ||||||
|  | 
 | ||||||
| "addClient" = "Додати клієнта" | "addClient" = "Додати клієнта" | ||||||
| "submitDisable" = "Надіслати як вимкнено ☑️" | "submitDisable" = "Надіслати як вимкнено ☑️" | ||||||
| "submitEnable" = "Надіслати як увімкнено ✅" | "submitEnable" = "Надіслати як увімкнено ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "Скинути весь трафік" | "ResetAllTraffics" = "Скинути весь трафік" | ||||||
| "SortedTrafficUsageReport" = "Відсортований звіт про використання трафіку" | "SortedTrafficUsageReport" = "Відсортований звіт про використання трафіку" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ Операція успішна!" | "successfulOperation" = "✅ Операція успішна!" | ||||||
| "errorOperation" = "❗ Помилка в роботі." | "errorOperation" = "❗ Помилка в роботі." | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "Thời gian hoạt động" | "operationHours" = "Thời gian hoạt động" | ||||||
| "systemLoad" = "Tải hệ thống" | "systemLoad" = "Tải hệ thống" | ||||||
| "systemLoadDesc" = "trung bình tải hệ thống trong 1, 5 và 15 phút qua" | "systemLoadDesc" = "trung bình tải hệ thống trong 1, 5 và 15 phút qua" | ||||||
|  | "connectionTcpCountDesc" = "Tổng số kết nối TCP trên tất cả các thẻ mạng." | ||||||
|  | "connectionUdpCountDesc" = "Tổng số kết nối UDP trên tất cả các thẻ mạng." | ||||||
| "connectionCount" = "Số lượng kết nối" | "connectionCount" = "Số lượng kết nối" | ||||||
| "ipAddresses" = "Địa chỉ IP" | "ipAddresses" = "Địa chỉ IP" | ||||||
| "toggleIpVisibility" = "Chuyển đổi hiển thị IP" | "toggleIpVisibility" = "Chuyển đổi hiển thị IP" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "Xóa người dùng" | "deleteClient" = "Xóa người dùng" | ||||||
| "deleteClientContent" = "Bạn có chắc chắn muốn xóa người dùng không?" | "deleteClientContent" = "Bạn có chắc chắn muốn xóa người dùng không?" | ||||||
| "resetTrafficContent" = "Xác nhận đặt lại lưu lượng?" | "resetTrafficContent" = "Xác nhận đặt lại lưu lượng?" | ||||||
|  | "inboundUpdateSuccess" = "Đã cập nhật kết nối inbound thành công." | ||||||
|  | "inboundCreateSuccess" = "Đã tạo kết nối inbound thành công." | ||||||
| "copyLink" = "Sao chép liên kết" | "copyLink" = "Sao chép liên kết" | ||||||
| "address" = "Địa chỉ" | "address" = "Địa chỉ" | ||||||
| "network" = "Mạng" | "network" = "Mạng" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng" | "resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng" | ||||||
| "trafficGetError" = "Lỗi khi lấy thông tin lưu lượng" | "trafficGetError" = "Lỗi khi lấy thông tin lưu lượng" | ||||||
| "getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519." | "getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519." | ||||||
| "getNewmldsa65Error" = "Lỗi khi lấy chúng tôi mldsa65." |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "Lời yêu cầu" | "request" = "Lời yêu cầu" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 Đã cập nhật lần cuối vào: {{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 Đã cập nhật lần cuối vào: {{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ Có" | "yes" = "✅ Có" | ||||||
| "no" = "❌ Không" | "no" = "❌ Không" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID đã được cập nhật." | "received_id" = "🔑📥 ID đã được cập nhật." | ||||||
| "received_password" = "🔑📥 Mật khẩu đã được cập nhật." | "received_password" = "🔑📥 Mật khẩu đã được cập nhật." | ||||||
| "received_email" = "📧📥 Email đã được cập nhật." | "received_email" = "📧📥 Email đã được cập nhật." | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Kết quả: ❌ Thất bại \n\n🛠️ Lỗi: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 Email: {{ .ClientEmail }}\n🏁 Kết quả: ❌ Thất bại \n\n🛠️ Lỗi: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 Quá trình đặt lại lưu lượng đã hoàn tất cho tất cả khách hàng." | "FinishProcess" = "🔚 Quá trình đặt lại lưu lượng đã hoàn tất cho tất cả khách hàng." | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ Đóng Bàn Phím" | "closeKeyboard" = "❌ Đóng Bàn Phím" | ||||||
| "cancel" = "❌ Hủy" | "cancel" = "❌ Hủy" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 Giới hạn lưu lượng" | "limitTraffic" = "🚧 Giới hạn lưu lượng" | ||||||
| "getBanLogs" = "Cấm nhật ký" | "getBanLogs" = "Cấm nhật ký" | ||||||
| "allClients" = "Tất cả Khách hàng" | "allClients" = "Tất cả Khách hàng" | ||||||
|  | 
 | ||||||
| "addClient" = "Thêm Khách Hàng" | "addClient" = "Thêm Khách Hàng" | ||||||
| "submitDisable" = "Gửi Dưới Dạng Vô Hiệu ☑️" | "submitDisable" = "Gửi Dưới Dạng Vô Hiệu ☑️" | ||||||
| "submitEnable" = "Gửi Dưới Dạng Kích Hoạt ✅" | "submitEnable" = "Gửi Dưới Dạng Kích Hoạt ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "Đặt lại tất cả lưu lượng" | "ResetAllTraffics" = "Đặt lại tất cả lưu lượng" | ||||||
| "SortedTrafficUsageReport" = "Báo cáo sử dụng lưu lượng đã sắp xếp" | "SortedTrafficUsageReport" = "Báo cáo sử dụng lưu lượng đã sắp xếp" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ Thành công!" | "successfulOperation" = "✅ Thành công!" | ||||||
| "errorOperation" = "❗ Lỗi Trong Quá Trình Thực Hiện." | "errorOperation" = "❗ Lỗi Trong Quá Trình Thực Hiện." | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "系统正常运行时间" | "operationHours" = "系统正常运行时间" | ||||||
| "systemLoad" = "系统负载" | "systemLoad" = "系统负载" | ||||||
| "systemLoadDesc" = "过去 1、5 和 15 分钟的系统平均负载" | "systemLoadDesc" = "过去 1、5 和 15 分钟的系统平均负载" | ||||||
|  | "connectionTcpCountDesc" = "系统中所有 TCP 连接数" | ||||||
|  | "connectionUdpCountDesc" = "系统中所有 UDP 连接数" | ||||||
| "connectionCount" = "连接数" | "connectionCount" = "连接数" | ||||||
| "ipAddresses" = "IP地址" | "ipAddresses" = "IP地址" | ||||||
| "toggleIpVisibility" = "切换IP可见性" | "toggleIpVisibility" = "切换IP可见性" | ||||||
|  | @ -173,6 +175,8 @@ | ||||||
| "deleteClient" = "删除客户端" | "deleteClient" = "删除客户端" | ||||||
| "deleteClientContent" = "确定要删除客户端吗?" | "deleteClientContent" = "确定要删除客户端吗?" | ||||||
| "resetTrafficContent" = "确定要重置流量吗?" | "resetTrafficContent" = "确定要重置流量吗?" | ||||||
|  | "inboundUpdateSuccess" = "入站连接已成功更新。" | ||||||
|  | "inboundCreateSuccess" = "入站连接已成功创建。" | ||||||
| "copyLink" = "复制链接" | "copyLink" = "复制链接" | ||||||
| "address" = "地址" | "address" = "地址" | ||||||
| "network" = "网络" | "network" = "网络" | ||||||
|  | @ -258,7 +262,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "流量已重置" | "resetInboundClientTrafficSuccess" = "流量已重置" | ||||||
| "trafficGetError" = "获取流量数据时出错" | "trafficGetError" = "获取流量数据时出错" | ||||||
| "getNewX25519CertError" = "获取X25519证书时出错。" | "getNewX25519CertError" = "获取X25519证书时出错。" | ||||||
| "getNewmldsa65Error" = "获取mldsa65证书时出错。" |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "请求" | "request" = "请求" | ||||||
|  | @ -643,6 +646,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 刷新时间:{{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 刷新时间:{{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ 是的" | "yes" = "✅ 是的" | ||||||
| "no" = "❌ 没有" | "no" = "❌ 没有" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID 已更新。" | "received_id" = "🔑📥 ID 已更新。" | ||||||
| "received_password" = "🔑📥 密码已更新。" | "received_password" = "🔑📥 密码已更新。" | ||||||
| "received_email" = "📧📥 邮箱已更新。" | "received_email" = "📧📥 邮箱已更新。" | ||||||
|  | @ -662,6 +666,7 @@ | ||||||
| "FailedResetTraffic" = "📧 邮箱: {{ .ClientEmail }}\n🏁 结果: ❌ 失败 \n\n🛠️ 错误: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 邮箱: {{ .ClientEmail }}\n🏁 结果: ❌ 失败 \n\n🛠️ 错误: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 所有客户的流量重置已完成。" | "FinishProcess" = "🔚 所有客户的流量重置已完成。" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ 关闭键盘" | "closeKeyboard" = "❌ 关闭键盘" | ||||||
| "cancel" = "❌ 取消" | "cancel" = "❌ 取消" | ||||||
|  | @ -695,6 +700,7 @@ | ||||||
| "limitTraffic" = "🚧 流量限制" | "limitTraffic" = "🚧 流量限制" | ||||||
| "getBanLogs" = "禁止日志" | "getBanLogs" = "禁止日志" | ||||||
| "allClients" = "所有客户" | "allClients" = "所有客户" | ||||||
|  | 
 | ||||||
| "addClient" = "添加客户" | "addClient" = "添加客户" | ||||||
| "submitDisable" = "提交为禁用 ☑️" | "submitDisable" = "提交为禁用 ☑️" | ||||||
| "submitEnable" = "提交为启用 ✅" | "submitEnable" = "提交为启用 ✅" | ||||||
|  | @ -706,6 +712,7 @@ | ||||||
| "ResetAllTraffics" = "重置所有流量" | "ResetAllTraffics" = "重置所有流量" | ||||||
| "SortedTrafficUsageReport" = "排序的流量使用报告" | "SortedTrafficUsageReport" = "排序的流量使用报告" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ 成功!" | "successfulOperation" = "✅ 成功!" | ||||||
| "errorOperation" = "❗ 操作错误。" | "errorOperation" = "❗ 操作错误。" | ||||||
|  |  | ||||||
|  | @ -117,6 +117,8 @@ | ||||||
| "operationHours" = "系統正常執行時間" | "operationHours" = "系統正常執行時間" | ||||||
| "systemLoad" = "系統負載" | "systemLoad" = "系統負載" | ||||||
| "systemLoadDesc" = "過去 1、5 和 15 分鐘的系統平均負載" | "systemLoadDesc" = "過去 1、5 和 15 分鐘的系統平均負載" | ||||||
|  | "connectionTcpCountDesc" = "系統中所有 TCP 連線數" | ||||||
|  | "connectionUdpCountDesc" = "系統中所有 UDP 連線數" | ||||||
| "connectionCount" = "連線數" | "connectionCount" = "連線數" | ||||||
| "ipAddresses" = "IP地址" | "ipAddresses" = "IP地址" | ||||||
| "toggleIpVisibility" = "切換IP可見性" | "toggleIpVisibility" = "切換IP可見性" | ||||||
|  | @ -167,12 +169,16 @@ | ||||||
| "generalActions" = "通用操作" | "generalActions" = "通用操作" | ||||||
| "autoRefresh" = "自動刷新" | "autoRefresh" = "自動刷新" | ||||||
| "autoRefreshInterval" = "間隔" | "autoRefreshInterval" = "間隔" | ||||||
|  | "create" = "新增" | ||||||
|  | "update" = "修改" | ||||||
| "modifyInbound" = "修改入站" | "modifyInbound" = "修改入站" | ||||||
| "deleteInbound" = "刪除入站" | "deleteInbound" = "刪除入站" | ||||||
| "deleteInboundContent" = "確定要刪除入站嗎?" | "deleteInboundContent" = "確定要刪除入站嗎?" | ||||||
| "deleteClient" = "刪除客戶端" | "deleteClient" = "刪除客戶端" | ||||||
| "deleteClientContent" = "確定要刪除客戶端嗎?" | "deleteClientContent" = "確定要刪除客戶端嗎?" | ||||||
| "resetTrafficContent" = "確定要重置流量嗎?" | "resetTrafficContent" = "確定要重置流量嗎?" | ||||||
|  | "inboundUpdateSuccess" = "入站連接已成功更新。" | ||||||
|  | "inboundCreateSuccess" = "入站連接已成功建立。" | ||||||
| "copyLink" = "複製連結" | "copyLink" = "複製連結" | ||||||
| "address" = "地址" | "address" = "地址" | ||||||
| "network" = "網路" | "network" = "網路" | ||||||
|  | @ -258,7 +264,6 @@ | ||||||
| "resetInboundClientTrafficSuccess" = "流量已重置" | "resetInboundClientTrafficSuccess" = "流量已重置" | ||||||
| "trafficGetError" = "取得流量資料時發生錯誤" | "trafficGetError" = "取得流量資料時發生錯誤" | ||||||
| "getNewX25519CertError" = "取得X25519憑證時發生錯誤。" | "getNewX25519CertError" = "取得X25519憑證時發生錯誤。" | ||||||
| "getNewmldsa65Error" = "取得mldsa65憑證時發生錯誤。" |  | ||||||
| 
 | 
 | ||||||
| [pages.inbounds.stream.general] | [pages.inbounds.stream.general] | ||||||
| "request" = "請求" | "request" = "請求" | ||||||
|  | @ -643,6 +648,7 @@ | ||||||
| "refreshedOn" = "\r\n📋🔄 重新整理時間:{{ .Time }}\r\n\r\n" | "refreshedOn" = "\r\n📋🔄 重新整理時間:{{ .Time }}\r\n\r\n" | ||||||
| "yes" = "✅ 是的" | "yes" = "✅ 是的" | ||||||
| "no" = "❌ 沒有" | "no" = "❌ 沒有" | ||||||
|  | 
 | ||||||
| "received_id" = "🔑📥 ID 已更新。" | "received_id" = "🔑📥 ID 已更新。" | ||||||
| "received_password" = "🔑📥 密碼已更新。" | "received_password" = "🔑📥 密碼已更新。" | ||||||
| "received_email" = "📧📥 電子郵件已更新。" | "received_email" = "📧📥 電子郵件已更新。" | ||||||
|  | @ -662,6 +668,7 @@ | ||||||
| "FailedResetTraffic" = "📧 電子郵件: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ 錯誤: [ {{ .ErrorMessage }} ]" | "FailedResetTraffic" = "📧 電子郵件: {{ .ClientEmail }}\n🏁 結果: ❌ 失敗 \n\n🛠️ 錯誤: [ {{ .ErrorMessage }} ]" | ||||||
| "FinishProcess" = "🔚 所有客戶的流量重置已完成。" | "FinishProcess" = "🔚 所有客戶的流量重置已完成。" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.buttons] | [tgbot.buttons] | ||||||
| "closeKeyboard" = "❌ 關閉鍵盤" | "closeKeyboard" = "❌ 關閉鍵盤" | ||||||
| "cancel" = "❌ 取消" | "cancel" = "❌ 取消" | ||||||
|  | @ -695,6 +702,7 @@ | ||||||
| "limitTraffic" = "🚧 流量限制" | "limitTraffic" = "🚧 流量限制" | ||||||
| "getBanLogs" = "禁止日誌" | "getBanLogs" = "禁止日誌" | ||||||
| "allClients" = "所有客戶" | "allClients" = "所有客戶" | ||||||
|  | 
 | ||||||
| "addClient" = "新增客戶" | "addClient" = "新增客戶" | ||||||
| "submitDisable" = "以停用方式送出 ☑️" | "submitDisable" = "以停用方式送出 ☑️" | ||||||
| "submitEnable" = "以啟用方式送出 ✅" | "submitEnable" = "以啟用方式送出 ✅" | ||||||
|  | @ -706,6 +714,7 @@ | ||||||
| "ResetAllTraffics" = "重設所有流量" | "ResetAllTraffics" = "重設所有流量" | ||||||
| "SortedTrafficUsageReport" = "排序過的流量使用報告" | "SortedTrafficUsageReport" = "排序過的流量使用報告" | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| [tgbot.answers] | [tgbot.answers] | ||||||
| "successfulOperation" = "✅ 成功!" | "successfulOperation" = "✅ 成功!" | ||||||
| "errorOperation" = "❗ 操作錯誤。" | "errorOperation" = "❗ 操作錯誤。" | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								x-ui.sh
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								x-ui.sh
									
									
									
									
									
								
							|  | @ -214,7 +214,7 @@ reset_webbasepath() { | ||||||
|         return |         return | ||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|     config_webBasePath=$(gen_random_string 18) |     config_webBasePath=$(gen_random_string 10) | ||||||
| 
 | 
 | ||||||
|     # Apply the new web base path setting |     # Apply the new web base path setting | ||||||
|     /usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}" >/dev/null 2>&1 |     /usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}" >/dev/null 2>&1 | ||||||
|  | @ -249,10 +249,7 @@ check_config() { | ||||||
|     local existing_webBasePath=$(echo "$info" | grep -Eo 'webBasePath: .+' | awk '{print $2}') |     local existing_webBasePath=$(echo "$info" | grep -Eo 'webBasePath: .+' | awk '{print $2}') | ||||||
|     local existing_port=$(echo "$info" | grep -Eo 'port: .+' | awk '{print $2}') |     local existing_port=$(echo "$info" | grep -Eo 'port: .+' | awk '{print $2}') | ||||||
|     local existing_cert=$(/usr/local/x-ui/x-ui setting -getCert true | grep -Eo 'cert: .+' | awk '{print $2}') |     local existing_cert=$(/usr/local/x-ui/x-ui setting -getCert true | grep -Eo 'cert: .+' | awk '{print $2}') | ||||||
|     local server_ip=$(curl -s --max-time 3 https://api.ipify.org) |     local server_ip=$(curl -s https://api.ipify.org) | ||||||
|     if [ -z "$server_ip" ]; then |  | ||||||
|         server_ip=$(curl -s --max-time 3 https://4.ident.me) |  | ||||||
|     fi |  | ||||||
| 
 | 
 | ||||||
|     if [[ -n "$existing_cert" ]]; then |     if [[ -n "$existing_cert" ]]; then | ||||||
|         local domain=$(basename "$(dirname "$existing_cert")") |         local domain=$(basename "$(dirname "$existing_cert")") | ||||||
|  | @ -1633,10 +1630,7 @@ remove_iplimit() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| SSH_port_forwarding() { | SSH_port_forwarding() { | ||||||
|     local server_ip=$(curl -s --max-time 3 https://api.ipify.org) |     local server_ip=$(curl -s https://api.ipify.org) | ||||||
|     if [ -z "$server_ip" ]; then |  | ||||||
|         server_ip=$(curl -s --max-time 3 https://4.ident.me) |  | ||||||
|     fi |  | ||||||
|     local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}') |     local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}') | ||||||
|     local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}') |     local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}') | ||||||
|     local existing_listenIP=$(/usr/local/x-ui/x-ui setting -getListen true | grep -Eo 'listenIP: .+' | awk '{print $2}') |     local existing_listenIP=$(/usr/local/x-ui/x-ui setting -getListen true | grep -Eo 'listenIP: .+' | awk '{print $2}') | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ func (lw *LogWriter) Write(m []byte) (n int, err error) { | ||||||
| 	if crashRegex.MatchString(message) { | 	if crashRegex.MatchString(message) { | ||||||
| 		logger.Debug("Core crash detected:\n", message) | 		logger.Debug("Core crash detected:\n", message) | ||||||
| 		lw.lastLine = message | 		lw.lastLine = message | ||||||
| 		err1 := writeCrashReport(m) | 		err1 := writeCrachReport(m) | ||||||
| 		if err1 != nil { | 		if err1 != nil { | ||||||
| 			logger.Error("Unable to write crash report:", err1) | 			logger.Error("Unable to write crash report:", err1) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -239,15 +239,10 @@ func (p *process) Stop() error { | ||||||
| 	if !p.IsRunning() { | 	if !p.IsRunning() { | ||||||
| 		return errors.New("xray is not running") | 		return errors.New("xray is not running") | ||||||
| 	} | 	} | ||||||
| 	 |  | ||||||
| 	if runtime.GOOS == "windows" { |  | ||||||
| 		return p.cmd.Process.Kill() |  | ||||||
| 	} else { |  | ||||||
| 	return p.cmd.Process.Signal(syscall.SIGTERM) | 	return p.cmd.Process.Signal(syscall.SIGTERM) | ||||||
| } | } | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| func writeCrashReport(m []byte) error { | func writeCrachReport(m []byte) error { | ||||||
| 	crashReportPath := config.GetBinFolderPath() + "/core_crash_" + time.Now().Format("20060102_150405") + ".log" | 	crashReportPath := config.GetBinFolderPath() + "/core_crash_" + time.Now().Format("20060102_150405") + ".log" | ||||||
| 	return os.WriteFile(crashReportPath, m, os.ModePerm) | 	return os.WriteFile(crashReportPath, m, os.ModePerm) | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue