Merge pull request #300867 from linsui/ruleset

sing-geoip: add rule-set

authored by Aleksana and committed by GitHub 7a3d2d33 1a948a4f

+80 -6
+12 -6
pkgs/data/misc/sing-geoip/default.nix
··· 8 let 9 generator = buildGoModule rec { 10 pname = "sing-geoip"; 11 - version = "20230512"; 12 13 src = fetchFromGitHub { 14 owner = "SagerNet"; 15 repo = pname; 16 rev = "refs/tags/${version}"; 17 - hash = "sha256-Zm+5N/37hoHpH/TLNJrHeaBXI8G1jEpM1jz6Um8edNE="; 18 }; 19 20 - vendorHash = "sha256-ejXAdsJwXhqet+Ca+pDLWwu0gex79VcIxW6rmhRnbTQ="; 21 22 meta = with lib; { 23 description = "GeoIP data for sing-box"; 24 homepage = "https://github.com/SagerNet/sing-geoip"; 25 license = licenses.gpl3Plus; 26 maintainers = with maintainers; [ linsui ]; 27 }; 28 }; 29 in 30 - stdenvNoCC.mkDerivation rec { 31 inherit (generator) pname; 32 inherit (dbip-country-lite) version; 33 ··· 38 buildPhase = '' 39 runHook preBuild 40 41 - ${pname} ${dbip-country-lite.mmdb} geoip.db 42 - ${pname} ${dbip-country-lite.mmdb} geoip-cn.db cn 43 44 runHook postBuild 45 ''; ··· 49 50 install -Dm644 geoip.db $out/share/sing-box/geoip.db 51 install -Dm644 geoip-cn.db $out/share/sing-box/geoip-cn.db 52 53 runHook postInstall 54 '';
··· 8 let 9 generator = buildGoModule rec { 10 pname = "sing-geoip"; 11 + version = "20240312"; 12 13 src = fetchFromGitHub { 14 owner = "SagerNet"; 15 repo = pname; 16 rev = "refs/tags/${version}"; 17 + hash = "sha256-nIrbiECK25GyuPEFqMvPdZUShC2JC1NI60Y10SsoWyY="; 18 }; 19 20 + vendorHash = "sha256-WH0eMg06qCiVcy4H+vBtYrmLMA2KJRCPGXiEnatW+LU="; 21 + 22 + postPatch = '' 23 + sed -i -e '/func main()/,/^}/d' main.go 24 + cat ${./main.go} >> main.go 25 + ''; 26 27 meta = with lib; { 28 description = "GeoIP data for sing-box"; 29 homepage = "https://github.com/SagerNet/sing-geoip"; 30 license = licenses.gpl3Plus; 31 maintainers = with maintainers; [ linsui ]; 32 + mainProgram = "sing-geoip"; 33 }; 34 }; 35 in 36 + stdenvNoCC.mkDerivation { 37 inherit (generator) pname; 38 inherit (dbip-country-lite) version; 39 ··· 44 buildPhase = '' 45 runHook preBuild 46 47 + sing-geoip ${dbip-country-lite.mmdb} 48 49 runHook postBuild 50 ''; ··· 54 55 install -Dm644 geoip.db $out/share/sing-box/geoip.db 56 install -Dm644 geoip-cn.db $out/share/sing-box/geoip-cn.db 57 + install -Dm644 rule-set/* -t $out/share/sing-box/rule-set 58 59 runHook postInstall 60 '';
+68
pkgs/data/misc/sing-geoip/main.go
···
··· 1 + func main() { 2 + var err error 3 + 4 + input := os.Args[1] 5 + ruleSetOutput := "rule-set" 6 + 7 + binary, err := os.ReadFile(input) 8 + if err != nil { 9 + panic(err) 10 + } 11 + metadata, countryMap, err := parse(binary) 12 + if err != nil { 13 + panic(err) 14 + } 15 + allCodes := make([]string, 0, len(countryMap)) 16 + for code := range countryMap { 17 + allCodes = append(allCodes, code) 18 + } 19 + 20 + writer, err := newWriter(metadata, allCodes) 21 + if err != nil { 22 + panic(err) 23 + } 24 + err = write(writer, countryMap, "geoip.db", nil) 25 + if err != nil { 26 + panic(err) 27 + } 28 + 29 + writer, err = newWriter(metadata, []string{"cn"}) 30 + if err != nil { 31 + panic(err) 32 + } 33 + err = write(writer, countryMap, "geoip-cn.db", []string{"cn"}) 34 + if err != nil { 35 + panic(err) 36 + } 37 + 38 + err = os.MkdirAll(ruleSetOutput, 0o755) 39 + if err != nil { 40 + panic(err) 41 + } 42 + for countryCode, ipNets := range countryMap { 43 + var headlessRule option.DefaultHeadlessRule 44 + headlessRule.IPCIDR = make([]string, 0, len(ipNets)) 45 + for _, cidr := range ipNets { 46 + headlessRule.IPCIDR = append(headlessRule.IPCIDR, cidr.String()) 47 + } 48 + var plainRuleSet option.PlainRuleSet 49 + plainRuleSet.Rules = []option.HeadlessRule{ 50 + { 51 + Type: C.RuleTypeDefault, 52 + DefaultOptions: headlessRule, 53 + }, 54 + } 55 + srsPath, _ := filepath.Abs(filepath.Join(ruleSetOutput, "geoip-"+countryCode+".srs")) 56 + os.Stderr.WriteString("write " + srsPath + "\n") 57 + outputRuleSet, err := os.Create(srsPath) 58 + if err != nil { 59 + panic(err) 60 + } 61 + err = srs.Write(outputRuleSet, plainRuleSet) 62 + if err != nil { 63 + outputRuleSet.Close() 64 + panic(err) 65 + } 66 + outputRuleSet.Close() 67 + } 68 + }