Commit 5347c5aa authored by nanahira's avatar nanahira

pcc

parent 8d032150
...@@ -16,6 +16,9 @@ restore_mark_switch -A {{plan.destMark}} ...@@ -16,6 +16,9 @@ restore_mark_switch -A {{plan.destMark}}
{% if gw.selectionMark > 0 %} {% if gw.selectionMark > 0 %}
interface_switch_china -A u_{{gw.isp}}_china {{gw.selectionMark}} interface_switch_china -A u_{{gw.isp}}_china {{gw.selectionMark}}
interface_switch_oversea -A u_{{gw.isp}}_oversea {{gw.selectionMark}} interface_switch_oversea -A u_{{gw.isp}}_oversea {{gw.selectionMark}}
{% for rule in gw.pccRules %}
interface_switch_oversea -A {{gw.isp}} {{gw.selectionMark}} {{rule.src}} {{rule.dst}}
{% endfor %}
restore_mark_switch -A {{gw.selectionMark}} restore_mark_switch -A {{gw.selectionMark}}
{% endif %} {% endif %}
interface_switch_redirect -A {{gw.selectionMark}} {{gw.redirectServerPort}} {{gw.redirectTargetPorts}} interface_switch_redirect -A {{gw.selectionMark}} {{gw.redirectServerPort}} {{gw.redirectTargetPorts}}
......
...@@ -68,6 +68,16 @@ interface_switch_oversea() { ...@@ -68,6 +68,16 @@ interface_switch_oversea() {
$IPTABLES_EXEC -t mangle "$OPTION" NEXTGEN_SWITCH -m mark --mark 0 -m set --match-set "$IPSET" src -m set ! --match-set mycard dst -m set --match-set chnrouter dst -j CONNMARK --set-xmark "$MARK" $IPTABLES_EXEC -t mangle "$OPTION" NEXTGEN_SWITCH -m mark --mark 0 -m set --match-set "$IPSET" src -m set ! --match-set mycard dst -m set --match-set chnrouter dst -j CONNMARK --set-xmark "$MARK"
} }
interface_switch_pcc() {
OPTION=$1
ISP=$2
MARK=$3
SRC=$3
DST=$4
ipset create "$IPSET" hash:net maxelem 1000000 || true
$IPTABLES_EXEC -t mangle "$OPTION" NEXTGEN_SWITCH -m mark --mark 0 -m set --match-set mycard src -m set ! --match-set "u_${ISP}_oversea" src -m set ! --match-set "u_${ISP}_china" src -m set ! --match-set mycard dst -s "$SRC" -d "$DST" -j CONNMARK --set-xmark "$MARK"
}
interface_switch_redirect() { interface_switch_redirect() {
OPTION=$1 OPTION=$1
MARK=$2 MARK=$2
......
{ {
"name": "nextgen", "name": "nextgen",
"version": "1.0.0", "version": "1.0.0",
"lockfileVersion": 1, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": {
"": {
"name": "nextgen",
"version": "1.0.0",
"dependencies": {
"@types/ip": "^1.1.0",
"@types/lodash": "^4.14.149",
"@types/mustache": "^4.1.1",
"csv-parse": "^4.8.5",
"ip": "^1.1.5",
"ip-pcc": "^1.0.0",
"lodash": "^4.17.15",
"mustache": "^4.2.0",
"yaml": "^1.10.0"
},
"devDependencies": {
"@types/node": "^13.7.0",
"ts-node": "^8.6.2",
"typescript": "^3.7.5"
}
},
"node_modules/@types/ip": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@types/ip/-/ip-1.1.0.tgz",
"integrity": "sha512-dwNe8gOoF70VdL6WJBwVHtQmAX4RMd62M+mAB9HQFjG1/qiCLM/meRy95Pd14FYBbEDwCq7jgJs89cHpLBu4HQ==",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/lodash": {
"version": "4.14.149",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz",
"integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ=="
},
"node_modules/@types/mustache": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.1.1.tgz",
"integrity": "sha512-Sm0NWeLhS2QL7NNGsXvO+Fgp7e3JLHCO6RS3RCnfjAnkw6Y1bsji/AGfISdQZDIR/AeOyzkrxRk9jBkl55zdJw=="
},
"node_modules/@types/node": {
"version": "13.7.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz",
"integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ=="
},
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true
},
"node_modules/buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
"node_modules/csv-parse": {
"version": "4.8.5",
"resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.8.5.tgz",
"integrity": "sha512-rpsLmlLWJZifmLzZEVGbZ9phWnJyi+cCbCGYr4vX2NaHFtgbmQPFk+WmMkmMkQXgsIUn6CgnK9cTuUAfFjoXbA=="
},
"node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true,
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/ip": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
},
"node_modules/ip-pcc": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ip-pcc/-/ip-pcc-1.0.0.tgz",
"integrity": "sha512-I7WDCvboQq6qrgn20NWGNJFZm5D9OORuNtm6a8CV/+gtXBjgSpOvGXcoaQtXZetjqrS+JbunFIOnMYz0hNwHdg==",
"dependencies": {
"ip": "^1.1.5",
"lodash": "^4.17.21"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/make-error": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
"integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
"dev": true
},
"node_modules/mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
"bin": {
"mustache": "bin/mustache"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
"integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
"dev": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/ts-node": {
"version": "8.6.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
"integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
"dev": true,
"dependencies": {
"arg": "^4.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"source-map-support": "^0.5.6",
"yn": "3.1.1"
},
"bin": {
"ts-node": "dist/bin.js",
"ts-script": "dist/script.js"
},
"engines": {
"node": ">=6.0.0"
},
"peerDependencies": {
"typescript": ">=2.7"
}
},
"node_modules/typescript": {
"version": "3.7.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz",
"integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/yaml": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
"integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
"engines": {
"node": ">= 6"
}
},
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
"engines": {
"node": ">=6"
}
}
},
"dependencies": { "dependencies": {
"@types/ip": { "@types/ip": {
"version": "1.1.0", "version": "1.1.0",
...@@ -55,10 +231,19 @@ ...@@ -55,10 +231,19 @@
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
}, },
"ip-pcc": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ip-pcc/-/ip-pcc-1.0.0.tgz",
"integrity": "sha512-I7WDCvboQq6qrgn20NWGNJFZm5D9OORuNtm6a8CV/+gtXBjgSpOvGXcoaQtXZetjqrS+JbunFIOnMYz0hNwHdg==",
"requires": {
"ip": "^1.1.5",
"lodash": "^4.17.21"
}
},
"lodash": { "lodash": {
"version": "4.17.15", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
}, },
"make-error": { "make-error": {
"version": "1.3.5", "version": "1.3.5",
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
"@types/mustache": "^4.1.1", "@types/mustache": "^4.1.1",
"csv-parse": "^4.8.5", "csv-parse": "^4.8.5",
"ip": "^1.1.5", "ip": "^1.1.5",
"ip-pcc": "^1.0.0",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"mustache": "^4.2.0", "mustache": "^4.2.0",
"yaml": "^1.10.0" "yaml": "^1.10.0"
......
...@@ -8,6 +8,7 @@ import child_process from 'child_process'; ...@@ -8,6 +8,7 @@ import child_process from 'child_process';
import assert from 'assert'; import assert from 'assert';
import { promises as dns } from 'dns'; import { promises as dns } from 'dns';
import os from 'os'; import os from 'os';
import { getRules } from 'ip-pcc';
async function generateOcpasswdLine(username: string, password: string) { async function generateOcpasswdLine(username: string, password: string) {
const tmpName = os.tmpdir() + '/' + Math.floor(Math.random() * 10000000); const tmpName = os.tmpdir() + '/' + Math.floor(Math.random() * 10000000);
...@@ -41,9 +42,15 @@ interface GostConfig extends Partial<GostRoute> { ...@@ -41,9 +42,15 @@ interface GostConfig extends Partial<GostRoute> {
type CommonEntry = Record<string, any>; type CommonEntry = Record<string, any>;
interface Gateway {
[key: string]: any;
pccWeight?: number;
pccRules?: string[];
}
class InventoryBuilder { class InventoryBuilder {
hosts: { [key: string]: CommonEntry }; hosts: { [key: string]: CommonEntry };
gateways: Record<string, CommonEntry>; gateways: Record<string, Gateway>;
gatewayGroups: GatewayGroup[]; gatewayGroups: GatewayGroup[];
connections: string[]; connections: string[];
routeLists: Record<string, string[]>; routeLists: Record<string, string[]>;
...@@ -113,6 +120,7 @@ class InventoryBuilder { ...@@ -113,6 +120,7 @@ class InventoryBuilder {
gateway.redirectServerPort = 60100; gateway.redirectServerPort = 60100;
} }
gateway.redirectTargetPorts = gateway.redirectAllPorts ? '1:65535' : this.vars.redirectTargetPorts.replace(/-/g, ':'); gateway.redirectTargetPorts = gateway.redirectAllPorts ? '1:65535' : this.vars.redirectTargetPorts.replace(/-/g, ':');
gateway.pccRules = [];
} }
return gateways; return gateways;
} }
...@@ -268,10 +276,10 @@ class InventoryBuilder { ...@@ -268,10 +276,10 @@ class InventoryBuilder {
}; };
} }
const redirectAvailableGateways = Object.values(this.gateways[host.name]).filter(gateway => !gateway.hidden); const availableGateways = Object.values(this.gateways[host.name]).filter(gateway => !gateway.hidden);
const gostConfig: GostConfig = { const gostConfig: GostConfig = {
Routes: redirectAvailableGateways.map(gateway => { Routes: availableGateways.map(gateway => {
const useWarp = host.arch !== 'arm' && gateway.warp; const useWarp = host.arch !== 'arm' && gateway.warp;
return { return {
ServeNodes: [`red://${host.address}:${gateway.redirectServerPort}`], ServeNodes: [`red://${host.address}:${gateway.redirectServerPort}`],
...@@ -281,7 +289,7 @@ class InventoryBuilder { ...@@ -281,7 +289,7 @@ class InventoryBuilder {
}) })
}; };
const allRedirectServerPorts = redirectAvailableGateways.map(gateway => gateway.redirectServerPort).join(','); const allRedirectServerPorts = availableGateways.map(gateway => gateway.redirectServerPort).join(',');
if (gostConfig.Routes.length) { if (gostConfig.Routes.length) {
host.gostConfig = gostConfig; host.gostConfig = gostConfig;
...@@ -294,7 +302,7 @@ class InventoryBuilder { ...@@ -294,7 +302,7 @@ class InventoryBuilder {
command: '-C /etc/gost/gost.json' command: '-C /etc/gost/gost.json'
}; };
if (host.arch !== 'arm') { if (host.arch !== 'arm') {
for (const gateway of redirectAvailableGateways.filter(gw => gw.warp)) { for (const gateway of availableGateways.filter(gw => gw.warp)) {
host.dockerServices.services[`warp-${gateway.isp}`] = { host.dockerServices.services[`warp-${gateway.isp}`] = {
restart: 'always', restart: 'always',
image: 'git-registry.mycard.moe/nanahira/warp-proxy', image: 'git-registry.mycard.moe/nanahira/warp-proxy',
...@@ -307,6 +315,12 @@ class InventoryBuilder { ...@@ -307,6 +315,12 @@ class InventoryBuilder {
} }
} }
} }
const pccGateways = availableGateways.filter(gateway => gateway.pccWeight);
if (pccGateways.length) {
const gwPccRules = getRules(pccGateways.map(gw => gw.pccWeight));
gwPccRules.forEach((rule, index) => pccGateways[index].pccRules = rule);
}
host.frpcRestarts = []; host.frpcRestarts = [];
host.ocRestarts = []; host.ocRestarts = [];
...@@ -351,8 +365,6 @@ class InventoryBuilder { ...@@ -351,8 +365,6 @@ class InventoryBuilder {
} }
} }
return { return {
//ansible_ssh_host: host.host, //ansible_ssh_host: host.host,
//ansible_ssh_user: host.user, //ansible_ssh_user: host.user,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment