From ddf71b290143c89c61d544873d75885f38d949ae Mon Sep 17 00:00:00 2001 From: Dunamis4tw Date: Wed, 28 Feb 2024 00:06:09 +0500 Subject: [PATCH] add generation of v2ray files (.dat) --- generator.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 2 ++ go.sum | 5 +++++ 3 files changed, 57 insertions(+) diff --git a/generator.go b/generator.go index 12d9e2a..ffb98f9 100644 --- a/generator.go +++ b/generator.go @@ -13,6 +13,8 @@ import ( "github.com/sagernet/sing-box/common/geosite" "github.com/sagernet/sing-box/common/srs" "github.com/sagernet/sing-box/option" + router "github.com/v2fly/v2ray-core/v5/app/router/routercommon" + "google.golang.org/protobuf/proto" ) // Rule структура для представления правил в JSON @@ -89,6 +91,9 @@ func generate(fileDataArray []FileData, config Config) error { return fmt.Errorf("cannot create new mmdb: %v", err) } + // Готовим переменную для списка v2ray (.dat) + protoList := new(router.GeoSiteList) + // Перебираем файлы for _, fileData := range fileDataArray { @@ -191,6 +196,9 @@ func generate(fileDataArray []FileData, config Config) error { // Создаём массив айтемов (доменов) geosite (объект из библиотеки сингбокса) var domains []geosite.Item + // Создаём массив доменов v2ray (объект из библиотеки v2ray) + var v2raydomains []*router.Domain + // Находим исключающий файл с доменами этой же категории ExcludeFileData := findFileData(fileDataArray, false, false, false, fileData.Category) ExcludeFileDataRegex := findFileData(fileDataArray, false, false, true, fileData.Category) @@ -225,6 +233,12 @@ func generate(fileDataArray []FileData, config Config) error { Type: geosite.RuleTypeDomain, Value: strings.Replace(domain, "*.", "", 1), }) + // Добавляем домены в список доменов v2ray + v2raydomains = append(v2raydomains, &router.Domain{ + Type: router.Domain_Full, // Домен и поддомены + Value: strings.Replace(domain, "*.", "", 1), + Attribute: []*router.Domain_Attribute{}, + }) RuleSetDomain = append(RuleSetDomain, strings.Replace(domain, "*.", "", 1)) } else { // в случае, если нет символа "*", то просто добавляем домен задав тип, означающий что эта запись - домен @@ -232,6 +246,11 @@ func generate(fileDataArray []FileData, config Config) error { Type: geosite.RuleTypeDomain, Value: domain, }) + v2raydomains = append(v2raydomains, &router.Domain{ + Type: router.Domain_RootDomain, // Только домен, без поддоменов + Value: strings.Replace(domain, "*.", "", 1), + Attribute: []*router.Domain_Attribute{}, + }) RuleSetDomain = append(RuleSetDomain, domain) } @@ -248,6 +267,12 @@ func generate(fileDataArray []FileData, config Config) error { // Добавляем в map категорию domainsMap[fileData.Category] = domains + // Добавляем в категорию с доменами в dat файл + protoList.Entry = append(protoList.Entry, &router.GeoSite{ + CountryCode: fileData.Category, + Domain: v2raydomains, + }) + if lastIndex != 0 { fmt.Println() } @@ -332,6 +357,17 @@ func generate(fileDataArray []FileData, config Config) error { } } + // Сохранение в .dat файл (формат v2ray) + protoBytes, err := proto.Marshal(protoList) // Преобразование в байты + if err != nil { + return fmt.Errorf("error marshalling into bytes: %v", err) + } + if err := os.WriteFile(config.OutputDir+"domains.dat", protoBytes, 0644); err != nil { + return fmt.Errorf("error writing into v2ray geosite file: %v", err) + } else { + fmt.Println(config.OutputDir+"domains.dat", "has been generated successfully.") + } + if config.Generate.GeoIP { // Пытаемся создать файл geoip.db outIPs, err := os.Create(config.OutputDir + "geoip.db") @@ -450,3 +486,17 @@ func extractCategories(fileDataArray []FileData) []string { return categories } + +// v2ray +type Entry struct { + Type string + Value string + Attrs []*router.Domain_Attribute +} + +// v2ray +type ParsedList struct { + Name string + Inclusion map[string]bool + Entry []Entry +} diff --git a/go.mod b/go.mod index eb816c1..08afd26 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require github.com/maxmind/mmdbwriter v1.0.0 require ( berty.tech/go-libtor v1.0.385 // indirect + github.com/adrg/xdg v0.4.0 // indirect github.com/ajg/form v1.5.1 // indirect github.com/andybalholm/brotli v1.0.6 // indirect github.com/caddyserver/certmagic v0.19.2 // indirect @@ -83,6 +84,7 @@ require ( github.com/google/uuid v1.4.0 github.com/oschwald/maxminddb-golang v1.12.0 // indirect github.com/sagernet/sing-box v1.8.0-alpha.10 + github.com/v2fly/v2ray-core/v5 v5.13.0 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect golang.org/x/sys v0.15.0 // indirect ) diff --git a/go.sum b/go.sum index 5054c18..560836d 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ berty.tech/go-libtor v1.0.385 h1:RWK94C3hZj6Z2GdvePpHJLnWYobFr3bY/OdUJ5aoEXw= berty.tech/go-libtor v1.0.385/go.mod h1:9swOOQVb+kmvuAlsgWUK/4c52pm69AdbJsxLzk+fJEw= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= @@ -152,6 +154,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= +github.com/v2fly/v2ray-core/v5 v5.13.0 h1:BDJfi3Ftx1NpQlZZPpeWJe3RDqRNyIVBs+YGG4RRMDU= +github.com/v2fly/v2ray-core/v5 v5.13.0/go.mod h1:Bc3gmQWLr8UR7xBSCYI9FbfKuVvqA9lbkeBTWNRRAS4= github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= @@ -188,6 +192,7 @@ golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=