Unverified Commit 7a3d2d33 authored by Aleksana's avatar Aleksana Committed by GitHub
Browse files

Merge pull request #300867 from linsui/ruleset

sing-geoip: add rule-set
parents 1a948a4f 3536f166
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -8,26 +8,32 @@
let
  generator = buildGoModule rec {
    pname = "sing-geoip";
    version = "20230512";
    version = "20240312";

    src = fetchFromGitHub {
      owner = "SagerNet";
      repo = pname;
      rev = "refs/tags/${version}";
      hash = "sha256-Zm+5N/37hoHpH/TLNJrHeaBXI8G1jEpM1jz6Um8edNE=";
      hash = "sha256-nIrbiECK25GyuPEFqMvPdZUShC2JC1NI60Y10SsoWyY=";
    };

    vendorHash = "sha256-ejXAdsJwXhqet+Ca+pDLWwu0gex79VcIxW6rmhRnbTQ=";
    vendorHash = "sha256-WH0eMg06qCiVcy4H+vBtYrmLMA2KJRCPGXiEnatW+LU=";

    postPatch = ''
      sed -i -e '/func main()/,/^}/d' main.go
      cat ${./main.go} >> main.go
    '';

    meta = with lib; {
      description = "GeoIP data for sing-box";
      homepage = "https://github.com/SagerNet/sing-geoip";
      license = licenses.gpl3Plus;
      maintainers = with maintainers; [ linsui ];
      mainProgram = "sing-geoip";
    };
  };
in
stdenvNoCC.mkDerivation rec {
stdenvNoCC.mkDerivation {
  inherit (generator) pname;
  inherit (dbip-country-lite) version;

@@ -38,8 +44,7 @@ stdenvNoCC.mkDerivation rec {
  buildPhase = ''
    runHook preBuild

    ${pname} ${dbip-country-lite.mmdb} geoip.db
    ${pname} ${dbip-country-lite.mmdb} geoip-cn.db cn
    sing-geoip ${dbip-country-lite.mmdb}

    runHook postBuild
  '';
@@ -49,6 +54,7 @@ stdenvNoCC.mkDerivation rec {

    install -Dm644 geoip.db $out/share/sing-box/geoip.db
    install -Dm644 geoip-cn.db $out/share/sing-box/geoip-cn.db
    install -Dm644 rule-set/* -t $out/share/sing-box/rule-set

    runHook postInstall
  '';
+68 −0
Original line number Diff line number Diff line
func main() {
	var err error

  input := os.Args[1]
  ruleSetOutput := "rule-set"

  binary, err := os.ReadFile(input)
	if err != nil {
		panic(err)
	}
  metadata, countryMap, err := parse(binary)
	if err != nil {
		panic(err)
	}
	allCodes := make([]string, 0, len(countryMap))
	for code := range countryMap {
		allCodes = append(allCodes, code)
	}

	writer, err := newWriter(metadata, allCodes)
	if err != nil {
		panic(err)
	}
	err = write(writer, countryMap, "geoip.db", nil)
	if err != nil {
		panic(err)
	}

	writer, err = newWriter(metadata, []string{"cn"})
	if err != nil {
		panic(err)
	}
	err = write(writer, countryMap, "geoip-cn.db", []string{"cn"})
	if err != nil {
		panic(err)
	}

	err = os.MkdirAll(ruleSetOutput, 0o755)
	if err != nil {
		panic(err)
	}
	for countryCode, ipNets := range countryMap {
		var headlessRule option.DefaultHeadlessRule
		headlessRule.IPCIDR = make([]string, 0, len(ipNets))
		for _, cidr := range ipNets {
			headlessRule.IPCIDR = append(headlessRule.IPCIDR, cidr.String())
		}
		var plainRuleSet option.PlainRuleSet
		plainRuleSet.Rules = []option.HeadlessRule{
			{
				Type:           C.RuleTypeDefault,
				DefaultOptions: headlessRule,
			},
		}
		srsPath, _ := filepath.Abs(filepath.Join(ruleSetOutput, "geoip-"+countryCode+".srs"))
		os.Stderr.WriteString("write " + srsPath + "\n")
		outputRuleSet, err := os.Create(srsPath)
		if err != nil {
			panic(err)
		}
		err = srs.Write(outputRuleSet, plainRuleSet)
		if err != nil {
			outputRuleSet.Close()
			panic(err)
		}
		outputRuleSet.Close()
	}
}