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 8 let 9 9 generator = buildGoModule rec { 10 10 pname = "sing-geoip"; 11 - version = "20230512"; 11 + version = "20240312"; 12 12 13 13 src = fetchFromGitHub { 14 14 owner = "SagerNet"; 15 15 repo = pname; 16 16 rev = "refs/tags/${version}"; 17 - hash = "sha256-Zm+5N/37hoHpH/TLNJrHeaBXI8G1jEpM1jz6Um8edNE="; 17 + hash = "sha256-nIrbiECK25GyuPEFqMvPdZUShC2JC1NI60Y10SsoWyY="; 18 18 }; 19 19 20 - vendorHash = "sha256-ejXAdsJwXhqet+Ca+pDLWwu0gex79VcIxW6rmhRnbTQ="; 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 + ''; 21 26 22 27 meta = with lib; { 23 28 description = "GeoIP data for sing-box"; 24 29 homepage = "https://github.com/SagerNet/sing-geoip"; 25 30 license = licenses.gpl3Plus; 26 31 maintainers = with maintainers; [ linsui ]; 32 + mainProgram = "sing-geoip"; 27 33 }; 28 34 }; 29 35 in 30 - stdenvNoCC.mkDerivation rec { 36 + stdenvNoCC.mkDerivation { 31 37 inherit (generator) pname; 32 38 inherit (dbip-country-lite) version; 33 39 ··· 38 44 buildPhase = '' 39 45 runHook preBuild 40 46 41 - ${pname} ${dbip-country-lite.mmdb} geoip.db 42 - ${pname} ${dbip-country-lite.mmdb} geoip-cn.db cn 47 + sing-geoip ${dbip-country-lite.mmdb} 43 48 44 49 runHook postBuild 45 50 ''; ··· 49 54 50 55 install -Dm644 geoip.db $out/share/sing-box/geoip.db 51 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 52 58 53 59 runHook postInstall 54 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 + }