ソースを参照

Refactor: deprecate SSPanel appprofile.php output

SukkaW 2 日 前
コミット
2bbfb15db0

+ 2 - 3
Build/build-apple-cdn.ts

@@ -1,14 +1,13 @@
 import { parseFelixDnsmasqFromResp } from './lib/parse-dnsmasq';
 import { task } from './trace';
 import { SHARED_DESCRIPTION } from './constants/description';
-import { once } from 'foxts/once';
 import { DomainsetOutput } from './lib/rules/domainset';
 import { $$fetch } from './lib/fetch-retry';
 
-export const getAppleCdnDomainsPromise = once(() => $$fetch('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/apple.china.conf').then(parseFelixDnsmasqFromResp));
+const getAppleCdnDomainsPromise = $$fetch('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/apple.china.conf').then(parseFelixDnsmasqFromResp);
 
 export const buildAppleCdn = task(require.main === module, __filename)(async (span) => {
-  const res: string[] = await span.traceChildPromise('get apple cdn domains', getAppleCdnDomainsPromise());
+  const res: string[] = await span.traceChildPromise('get apple cdn domains', getAppleCdnDomainsPromise);
 
   return new DomainsetOutput(span, 'apple_cdn')
     .withTitle('Sukka\'s Ruleset - Apple CDN')

+ 1 - 1
Build/build-cdn-download-conf.ts

@@ -92,7 +92,7 @@ export const buildCdnDownloadConf = task(require.main === module, __filename)(as
     span.traceChildAsync(
       'load public ipfs gateway list',
       async () => {
-        const data = await (await $$fetch('https://cdn.jsdelivr.net/gh/ipfs/public-gateway-checker@refs/heads/main/gateways.json')).json();
+        const data = await (await $$fetch('https://cdn.jsdelivr.net/gh/ipfs/public-gateway-checker@main/gateways.json')).json();
         if (!Array.isArray(data)) {
           console.error('Invalid IPFS gateway list format');
           return [];

+ 5 - 8
Build/build-chn-cidr.ts

@@ -1,19 +1,16 @@
 import { fetchRemoteTextByLine } from './lib/fetch-text-by-line';
 import { task } from './trace';
 
-import { once } from 'foxts/once';
 import { IPListOutput } from './lib/rules/ip';
 import { createFileDescription } from './constants/description';
 
-export const getChnCidrPromise = once(async function getChnCidr() {
-  return Promise.all([
-    fetchRemoteTextByLine('https://chnroutes2.cdn.skk.moe/chnroutes.txt', true).then(Array.fromAsync<string>),
-    fetchRemoteTextByLine('https://gaoyifan.github.io/china-operator-ip/china6.txt', true).then(Array.fromAsync<string>)
-  ]);
-});
+const getChnCidrPromise = Promise.all([
+  fetchRemoteTextByLine('https://chnroutes2.cdn.skk.moe/chnroutes.txt', true).then(Array.fromAsync<string>),
+  fetchRemoteTextByLine('https://gaoyifan.github.io/china-operator-ip/china6.txt', true).then(Array.fromAsync<string>)
+]);
 
 export const buildChnCidr = task(require.main === module, __filename)(async (span) => {
-  const [filteredCidr4, cidr6] = await span.traceChildAsync('download chnroutes2', getChnCidrPromise);
+  const [filteredCidr4, cidr6] = await span.traceChildPromise('download chnroutes2', getChnCidrPromise);
 
   // Can not use SHARED_DESCRIPTION here as different license
   const description = createFileDescription('CC BY-SA 2.0');

+ 1 - 1
Build/build-global-server-dns-mapping.ts

@@ -9,7 +9,7 @@ import { readFileIntoProcessedArray } from './lib/fetch-text-by-line';
 import { SHARED_DESCRIPTION } from './constants/description';
 import { RulesetOutput } from './lib/rules/ruleset';
 
-export const getGlobalRulesetPromise = once(async () => {
+const getGlobalRulesetPromise = once(async () => {
   const globals = await readFileIntoProcessedArray(path.join(SOURCE_DIR, 'non_ip/global.conf'));
   const getDnsMappingRuleWithWildcard = createGetDnsMappingRule(true);
 

+ 2 - 3
Build/build-microsoft-cdn.ts

@@ -3,7 +3,6 @@ import { SHARED_DESCRIPTION } from './constants/description';
 import { RulesetOutput } from './lib/rules/ruleset';
 import Worktank from 'worktank';
 import { RULES } from './constants/microsoft-cdn';
-import { wait } from 'foxts/wait';
 
 const pool = new Worktank({
   pool: {
@@ -48,10 +47,10 @@ const pool = new Worktank({
   }
 });
 
-export const getMicrosoftCdnRulesetPromise = wait(0).then(() => pool.exec(
+const getMicrosoftCdnRulesetPromise = pool.exec(
   'getMicrosoftCdnRuleset',
   [__filename]
-)).finally(() => pool.terminate());
+).finally(() => pool.terminate());
 
 export const buildMicrosoftCdn = task(require.main === module, __filename)(async (span) => {
   const [domains, domainSuffixes] = await span.traceChildPromise('get microsoft cdn domains', getMicrosoftCdnRulesetPromise);

+ 1 - 2
Build/build-reject-domainset.ts

@@ -16,9 +16,8 @@ import { SHARED_DESCRIPTION } from './constants/description';
 
 import { addArrayElementsToSet } from 'foxts/add-array-elements-to-set';
 import { OUTPUT_INTERNAL_DIR, SOURCE_DIR } from './constants/dir';
-import { DomainsetOutput } from './lib/rules/domainset';
+import { DomainsetOutput, AdGuardHomeOutput } from './lib/rules/domainset';
 import { foundDebugDomain } from './lib/parse-filter/shared';
-import { AdGuardHomeOutput } from './lib/rules/domainset';
 import { getPhishingDomains } from './lib/get-phishing-domains';
 import type { MaybePromise } from './lib/misc';
 import { RulesetOutput } from './lib/rules/ruleset';

+ 0 - 290
Build/build-sspanel-appprofile.ts

@@ -1,290 +0,0 @@
-import { getAppleCdnDomainsPromise } from './build-apple-cdn';
-import { getDomesticAndDirectDomainsRulesetPromise } from './build-domestic-direct-lan-ruleset-dns-mapping-module';
-import { readFileIntoProcessedArray } from './lib/fetch-text-by-line';
-import { task } from './trace';
-import path from 'node:path';
-
-import { ALL as AllStreamServices } from '../Source/stream';
-import { getChnCidrPromise } from './build-chn-cidr';
-import { getTelegramCIDRPromise } from './lib/get-telegram-backup-ip';
-import { compareAndWriteFile } from './lib/create-file';
-import { getMicrosoftCdnRulesetPromise } from './build-microsoft-cdn';
-import { isTruthy, nullthrow } from 'foxts/guard';
-import { appendArrayInPlace } from 'foxts/append-array-in-place';
-import { OUTPUT_INTERNAL_DIR, OUTPUT_SURGE_DIR, SOURCE_DIR } from './constants/dir';
-import { ClashOnlyRulesetOutput } from './lib/rules/ruleset';
-import { getGlobalRulesetPromise } from './build-global-server-dns-mapping';
-
-const POLICY_GROUPS: Array<[name: string, insertProxy: boolean, insertDirect: boolean]> = [
-  ['Default Proxy', true, false],
-  ['Global', true, true],
-  ['Microsoft & Apple', true, true],
-  ['Stream', true, false],
-  ['Steam Download', true, true],
-  ['Domestic', false, true],
-  ['Final Match', true, true]
-];
-
-const steamDomainsPromise = readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/game-download.conf'));
-
-/**
- * This only generates a simplified version, for under-used users only.
- */
-export const buildSSPanelUIMAppProfile = task(require.main === module, __filename)(async (span) => {
-  const streamRules = AllStreamServices.flatMap((i) => i.rules);
-  const [streamCidrs4, streamCidrs6] = AllStreamServices.reduce<[cidr4: string[], cidr6: string[]]>((acc, i) => {
-    if (i.ip) {
-      appendArrayInPlace(acc[0], i.ip.v4);
-      appendArrayInPlace(acc[1], i.ip.v6);
-    }
-
-    return acc;
-  }, [[], []]);
-
-  const [
-    [domesticRules, directRules, lanRules],
-    appleCdnDomains,
-    [microsoftCdnDomains, microsoftCdnDomainSuffixes],
-    appleCnRules,
-    neteaseMusicRules,
-    microsoftRules,
-    appleRules,
-    // streamRules,
-    steamDomainset,
-    [globalRules],
-    telegramRules,
-    [domesticCidrs4, domesticCidrs6],
-    // [streamCidrs4, streamCidrs6],
-    { ipcidr: telegramCidrs4, ipcidr6: telegramCidrs6 },
-    rawLanCidrs
-  ] = await Promise.all([
-    // domestic - domains
-    getDomesticAndDirectDomainsRulesetPromise(),
-    getAppleCdnDomainsPromise(),
-    getMicrosoftCdnRulesetPromise,
-    readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/apple_cn.conf')),
-    readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/neteasemusic.conf')),
-    // microsoft & apple - domains
-    readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/microsoft.conf')),
-    readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/apple_services.conf')),
-    // steam - domains
-    steamDomainsPromise,
-    // global - domains
-    getGlobalRulesetPromise(),
-    readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/telegram.conf')),
-    // domestic - ip cidr
-    getChnCidrPromise(),
-    // global - ip cidr
-    getTelegramCIDRPromise(),
-    // lan - ip cidr
-    readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'ip/lan.conf'))
-  ] as const);
-
-  const domestic = new ClashOnlyRulesetOutput(span, '_', 'non_ip')
-    .addFromRuleset(domesticRules)
-    .bulkAddDomainSuffix(appleCdnDomains)
-    .bulkAddDomain(microsoftCdnDomains)
-    .bulkAddDomainSuffix(microsoftCdnDomainSuffixes)
-    .addFromRuleset(appleCnRules)
-    .addFromRuleset(neteaseMusicRules);
-
-  const microsoftApple = new ClashOnlyRulesetOutput(span, '_', 'non_ip')
-    .addFromRuleset(microsoftRules)
-    .addFromRuleset(appleRules);
-
-  const stream = new ClashOnlyRulesetOutput(span, '_', 'non_ip')
-    .addFromRuleset(streamRules);
-
-  const steam = new ClashOnlyRulesetOutput(span, '_', 'non_ip')
-    .addFromDomainset(steamDomainset);
-
-  const global = new ClashOnlyRulesetOutput(span, '_', 'non_ip')
-    .addFromRuleset(globalRules)
-    .addFromRuleset(telegramRules);
-
-  const direct = new ClashOnlyRulesetOutput(span, '_', 'non_ip')
-    .addFromRuleset(directRules)
-    .addFromRuleset(lanRules);
-
-  const domesticCidr = new ClashOnlyRulesetOutput(span, '_', 'ip')
-    .bulkAddCIDR4(domesticCidrs4)
-    .bulkAddCIDR6(domesticCidrs6);
-
-  const streamCidr = new ClashOnlyRulesetOutput(span, '_', 'ip')
-    .bulkAddCIDR4(streamCidrs4)
-    .bulkAddCIDR6(streamCidrs6);
-
-  const telegramCidr = new ClashOnlyRulesetOutput(span, '_', 'ip')
-    .bulkAddCIDR4(telegramCidrs4)
-    .bulkAddCIDR6(telegramCidrs6);
-
-  const lanCidrs = new ClashOnlyRulesetOutput(span, '_', 'ip')
-    .addFromRuleset(rawLanCidrs);
-
-  const output = generateAppProfile(
-    ...(
-      (await Promise.all([
-        domestic.compile(),
-        microsoftApple.compile(),
-        stream.compile(),
-        steam.compile(),
-        global.compile(),
-        direct.compile(),
-        domesticCidr.compile(),
-        streamCidr.compile(),
-        telegramCidr.compile(),
-        lanCidrs.compile()
-      ])).map(output => nullthrow(output[0]))
-    ) as [
-      string[], string[], string[], string[], string[],
-      string[], string[], string[], string[], string[]
-    ]
-  );
-
-  await compareAndWriteFile(
-    span,
-    output,
-    path.resolve(OUTPUT_INTERNAL_DIR, 'appprofile.php')
-  );
-});
-
-function generateAppProfile(
-  directDomains: string[],
-  microsoftAppleDomains: string[],
-  streamDomains: string[],
-  steamDomains: string[],
-  globalDomains: string[],
-
-  lanDomains: string[],
-  directCidrs: string[],
-  streamCidrs: string[],
-  globalCidrs: string[],
-  lanCidrs: string[]
-) {
-  const redults = [
-    '<?php',
-    '',
-    `// # Build ${new Date().toISOString()}`,
-    '',
-    'declare(strict_types=1);',
-    '',
-    '$_ENV[\'Clash_Config\'] = [',
-    '    \'port\' => 7890,',
-    '    \'socks-port\' => 7891,',
-    '    \'allow-lan\' => false,',
-    '    \'mode\' => \'Rule\',',
-    '    \'ipv6\' => true,',
-    '    \'log-level\' => \'error\',',
-    '    \'external-controller\' => \'0.0.0.0:9090\',',
-    '    \'tun\' => [',
-    '      \'enable\' => true,',
-    '      \'stack\' => \'system\',',
-    '      \'auto-route\' => true,',
-    '      \'auto-redir\' => true,',
-    '      \'auto-detect-interface\' => true,',
-    '      \'dns-hijack\' => [',
-    '        \'8.8.8.8:53\',',
-    '        \'any:53\',',
-    '        \'tcp://8.8.8.8:53\',',
-    '        \'tcp://any:53\',',
-    '      ]',
-    '    ]',
-    '];',
-    '',
-    `$_ENV['Clash_Group_Indexes'] = [${JSON.stringify(POLICY_GROUPS.reduce<number[]>((acc, [, insertProxy], index) => {
-      if (insertProxy) {
-        acc.push(index);
-      }
-      return acc;
-    }, [])).slice(1, -1)}];`,
-    '$_ENV[\'Clash_Group_Config\'] = [',
-    '    \'proxy-groups\' => ['
-  ];
-
-  appendArrayInPlace(
-    redults,
-    POLICY_GROUPS.flatMap(([name, insertProxy, insertDirect]) => [
-      '        [',
-      `            'name' => '${name}',`,
-      '            \'type\' => \'select\',',
-      '            \'proxies\' => [',
-      insertProxy && name !== 'Default Proxy' && '                \'Default Proxy\',',
-      insertDirect && '                \'DIRECT\',',
-      '            ],',
-      '        ],'
-    ].filter(isTruthy))
-  );
-
-  appendArrayInPlace(
-    redults,
-    [
-      '    ],',
-      '    \'rules\' => ['
-    ]
-  );
-
-  // domestic - domains
-  appendArrayInPlace(
-    redults,
-    directDomains.map(line => `        '${line},Domestic',`)
-  );
-
-  // microsoft & apple - domains
-  appendArrayInPlace(
-    redults,
-    microsoftAppleDomains.map(line => `        '${line},Microsoft & Apple',`)
-  );
-
-  // stream - domains
-  appendArrayInPlace(
-    redults,
-    streamDomains.map(line => `        '${line},Stream',`)
-  );
-  // steam download - domains
-  appendArrayInPlace(
-    redults,
-    steamDomains.map(line => `        '${line},Steam Download',`)
-  );
-  // global - domains
-  appendArrayInPlace(
-    redults,
-    globalDomains.map(line => `        '${line},Global',`)
-  );
-  // microsoft & apple - ip cidr (nope)
-  // lan - domains
-  appendArrayInPlace(
-    redults,
-    lanDomains.map(line => `        '${line},DIRECT',`)
-  );
-  // stream - ip cidr
-  appendArrayInPlace(
-    redults,
-    streamCidrs.map(line => `        '${line},Stream',`)
-  );
-  // global - ip cidr
-  appendArrayInPlace(
-    redults,
-    globalCidrs.map(line => `        '${line},Global',`)
-  );
-  // domestic - ip cidr
-  appendArrayInPlace(
-    redults,
-    directCidrs.map(line => `        '${line},Domestic',`)
-  );
-  // lan - ip cidr
-  appendArrayInPlace(
-    redults,
-    lanCidrs.map(line => `        '${line},DIRECT',`)
-  );
-  // match
-  appendArrayInPlace(
-    redults,
-    [
-      '        \'MATCH,Final Match\',',
-      '    ],',
-      '];'
-    ]
-  );
-
-  return redults;
-}

+ 0 - 5
Build/index.ts

@@ -19,7 +19,6 @@ import { buildRedirectModule } from './build-sgmodule-redirect';
 import { buildAlwaysRealIPModule } from './build-sgmodule-always-realip';
 
 import { buildMicrosoftCdn } from './build-microsoft-cdn';
-import { buildSSPanelUIMAppProfile } from './build-sspanel-appprofile';
 
 import { buildPublic } from './build-public';
 import { downloadMockAssets } from './download-mock-assets';
@@ -98,10 +97,6 @@ const buildFinishedLock = path.join(ROOT_DIR, '.BUILD_FINISHED');
       downloadPreviousBuildPromise.then(() => buildAlwaysRealIPModule(rootSpan)),
       downloadPreviousBuildPromise.then(() => buildStreamService(rootSpan)),
       downloadPreviousBuildPromise.then(() => buildMicrosoftCdn(rootSpan)),
-      Promise.all([
-        downloadPreviousBuildPromise,
-        buildCommonPromise
-      ]).then(() => buildSSPanelUIMAppProfile(rootSpan)),
       downloadPreviousBuildPromise.then(() => buildCloudMounterRules(rootSpan)),
       downloadMockAssets(rootSpan)
     ]);