Commit 6aba8a3a authored by nanahira's avatar nanahira

Merge branch 'master' into haproxy

parents 09ed5cac 026fb8f2
...@@ -222,10 +222,8 @@ ...@@ -222,10 +222,8 @@
docker_compose: docker_compose:
project_src: '{{ansible_user_dir}}/nextgen-network/services' project_src: '{{ansible_user_dir}}/nextgen-network/services'
restarted: true restarted: true
services: services: '{{frpcRestarts}}'
- frpc-{{item.name}} when: frpcRestarts
with_items: '{{connections}}'
when: 'item.protocol == "wgfrp" and item.frpType == "frpc" and not noBird and not item.noUpdate'
- name: restart_ocserv - name: restart_ocserv
docker_compose: docker_compose:
project_src: '{{ansible_user_dir}}/nextgen-network/services' project_src: '{{ansible_user_dir}}/nextgen-network/services'
...@@ -237,10 +235,8 @@ ...@@ -237,10 +235,8 @@
docker_compose: docker_compose:
project_src: '{{ansible_user_dir}}/nextgen-network/services' project_src: '{{ansible_user_dir}}/nextgen-network/services'
restarted: true restarted: true
services: services: '{{ocRestarts}}'
- openconnect-{{item.name}} when: ocRestarts
with_items: '{{connections}}'
when: 'item.protocol == "oc" and item.ocType == "client" and not noBird and not item.noUpdate'
#- name: restart_bird_systemd #- name: restart_bird_systemd
# become: true # become: true
# systemd: # systemd:
......
#!/bin/bash #!/bin/bash
## reloaded at 6.24
source {{ansible_user_dir}}/nextgen-network/scripts/utility.sh source {{ansible_user_dir}}/nextgen-network/scripts/utility.sh
ip rule add pref 300 fwmark 999 table 999 ip rule add pref 300 fwmark 999 table 999
......
#!/bin/bash #!/bin/bash
LADDER="water" LADDER="jue"
ssh root@10.198.1.1 -p 55322 ipset add u_${LADDER}_chnroute 10.198.1.57 ssh root@10.198.1.1 -p 55322 ipset add u_${LADDER}_oversea 10.198.1.57
ssh nanahira@10.198.0.6 sudo ipset add u_${LADDER}_chnroute 10.198.1.57 #ssh nanahira@10.198.0.6 sudo ipset add u_${LADDER}_oversea 10.198.1.57
./config.sh ./config.sh
ssh root@10.198.1.1 -p 55322 ipset del u_${LADDER}_chnroute 10.198.1.57 ssh root@10.198.1.1 -p 55322 ipset del u_${LADDER}_oversea 10.198.1.57
ssh nanahira@10.198.0.6 sudo ipset del u_${LADDER}_chnroute 10.198.1.57 #ssh nanahira@10.198.0.6 sudo ipset del u_${LADDER}_oversea 10.198.1.57
...@@ -9,3 +9,7 @@ do ...@@ -9,3 +9,7 @@ do
echo "https://docs.google.com/spreadsheets/d/${doc}/export?exportFormat=csv&gid=${sheet}" echo "https://docs.google.com/spreadsheets/d/${doc}/export?exportFormat=csv&gid=${sheet}"
done ) | wget -4 --content-disposition -i - done ) | wget -4 --content-disposition -i -
cd .. cd ..
cd lists
./run.sh
cd ..
...@@ -17,6 +17,11 @@ ...@@ -17,6 +17,11 @@
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz",
"integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ=="
}, },
"@types/mustache": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.1.1.tgz",
"integrity": "sha512-Sm0NWeLhS2QL7NNGsXvO+Fgp7e3JLHCO6RS3RCnfjAnkw6Y1bsji/AGfISdQZDIR/AeOyzkrxRk9jBkl55zdJw=="
},
"@types/node": { "@types/node": {
"version": "13.7.0", "version": "13.7.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz",
...@@ -61,6 +66,11 @@ ...@@ -61,6 +66,11 @@
"integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
"dev": true "dev": true
}, },
"mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="
},
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
......
...@@ -10,9 +10,11 @@ ...@@ -10,9 +10,11 @@
"dependencies": { "dependencies": {
"@types/ip": "^1.1.0", "@types/ip": "^1.1.0",
"@types/lodash": "^4.14.149", "@types/lodash": "^4.14.149",
"@types/mustache": "^4.1.1",
"csv-parse": "^4.8.5", "csv-parse": "^4.8.5",
"ip": "^1.1.5", "ip": "^1.1.5",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"mustache": "^4.2.0",
"yaml": "^1.10.0" "yaml": "^1.10.0"
}, },
"devDependencies": { "devDependencies": {
......
...@@ -4,6 +4,6 @@ COMMAND="flush interface ${INTERFACE}\nquit" ...@@ -4,6 +4,6 @@ COMMAND="flush interface ${INTERFACE}\nquit"
COMMAND_BASE64=$(echo -e "$COMMAND" | base64 -w 0) COMMAND_BASE64=$(echo -e "$COMMAND" | base64 -w 0)
cd ansible cd ansible
ansible wg -m shell -a "echo $COMMAND_BASE64 | base64 --decode | timeout 1 nc ::1 33123" ansible wg -m shell -b -a "wg-quick down ${INTERFACE} ; echo $COMMAND_BASE64 | base64 --decode | timeout 1 nc ::1 33123"
ansible wg -m systemd -b -a "name=wg-quick@${INTERFACE} state=stopped enabled=false" ansible wg -m systemd -b -a "name=wg-quick@${INTERFACE} state=stopped enabled=false"
cd .. cd ..
...@@ -17,7 +17,7 @@ async function generateOcpasswdLine(username: string, password: string) { ...@@ -17,7 +17,7 @@ async function generateOcpasswdLine(username: string, password: string) {
return res; return res;
} }
interface GatewayGroup { interface GatewayGroup extends Record<string, any> {
id: number; id: number;
name: string; name: string;
locationPrefix: string; locationPrefix: string;
...@@ -27,15 +27,17 @@ interface GatewayGroup { ...@@ -27,15 +27,17 @@ interface GatewayGroup {
destMark: number; destMark: number;
} }
type CommonEntry = Record<string, any>;
class InventoryBuilder { class InventoryBuilder {
hosts: { [key: string]: any }; hosts: { [key: string]: CommonEntry };
gateways: any; gateways: Record<string, CommonEntry>;
gatewayGroups: GatewayGroup[]; gatewayGroups: GatewayGroup[];
connections: string[]; connections: string[];
routeLists: any; routeLists: Record<string, string[]>;
resolveCache: Map<string, string>; resolveCache: Map<string, string>;
resolver: dns.Resolver; resolver: dns.Resolver;
vars: any; vars: CommonEntry;
linksOnly: string[]; linksOnly: string[];
linksLimit: string[]; linksLimit: string[];
...@@ -45,6 +47,14 @@ class InventoryBuilder { ...@@ -45,6 +47,14 @@ class InventoryBuilder {
this.resolver.setServers(process.env.DNS ? [process.env.DNS] : ['114.114.114.114', '223.5.5.5']); this.resolver.setServers(process.env.DNS ? [process.env.DNS] : ['114.114.114.114', '223.5.5.5']);
} }
getDockerImageTag(host: any) {
if (host.arch && host.arch.length) {
return `:master-${host.arch}`;
} else {
return '';
}
}
async resolveDomain(domain: string, ipv6: boolean) { async resolveDomain(domain: string, ipv6: boolean) {
if (!domain || domain.match(/(\d{1,3}\.){3}\d{1,3}/)) { if (!domain || domain.match(/(\d{1,3}\.){3}\d{1,3}/)) {
return domain; return domain;
...@@ -70,7 +80,7 @@ class InventoryBuilder { ...@@ -70,7 +80,7 @@ class InventoryBuilder {
return resolvedIP; return resolvedIP;
} }
async load(sheetName: string) { async load(sheetName: string): Promise<Record<string, any>[]> {
const data = await fs.promises.readFile(path.join('data', `内网互联计划 - ${sheetName}.csv`)); const data = await fs.promises.readFile(path.join('data', `内网互联计划 - ${sheetName}.csv`));
// @ts-ignore // @ts-ignore
return (await util.promisify(parse)(data, { columns: true, cast: true })).filter(h => h.id); return (await util.promisify(parse)(data, { columns: true, cast: true })).filter(h => h.id);
...@@ -95,7 +105,7 @@ class InventoryBuilder { ...@@ -95,7 +105,7 @@ class InventoryBuilder {
async main() { async main() {
this.hosts = _.keyBy(await this.load('nextgen2'), 'name'); this.hosts = _.keyBy(await this.load('nextgen2'), 'name');
this.gateways = _.mapValues(_.groupBy(await this.loadGateways(), 'router'), g => _.keyBy(g, 'isp')); this.gateways = _.mapValues(_.groupBy(await this.loadGateways(), 'router'), g => _.keyBy(g, 'isp'));
this.gatewayGroups = await this.load('gateway groups'); this.gatewayGroups = await this.load('gateway groups') as GatewayGroup[];
//console.log(this.gateways); //console.log(this.gateways);
this.connections = _.intersection(Object.keys(this.hosts), Object.keys(_.find(this.hosts))); this.connections = _.intersection(Object.keys(this.hosts), Object.keys(_.find(this.hosts)));
...@@ -222,7 +232,7 @@ class InventoryBuilder { ...@@ -222,7 +232,7 @@ class InventoryBuilder {
services: { services: {
'gateways-monitor': { 'gateways-monitor': {
restart: 'always', restart: 'always',
image: 'git-registry.mycard.moe/railgun/gateways-monitor', image: `git-registry.mycard.moe/railgun/gateways-monitor${this.getDockerImageTag(host)}`,
network_mode: 'host', network_mode: 'host',
cap_add: ['NET_ADMIN'], cap_add: ['NET_ADMIN'],
volumes: ['./route-plans:/usr/src/app/route-plans:ro'], volumes: ['./route-plans:/usr/src/app/route-plans:ro'],
...@@ -233,13 +243,15 @@ class InventoryBuilder { ...@@ -233,13 +243,15 @@ class InventoryBuilder {
if (!host.sysBird) { if (!host.sysBird) {
host.dockerServices.services.babeld = { host.dockerServices.services.babeld = {
restart: 'always', restart: 'always',
image: 'git-registry.mycard.moe/railgun/babeld', image: `git-registry.mycard.moe/railgun/babeld${this.getDockerImageTag(host)}`,
network_mode: 'host', network_mode: 'host',
//cap_add: ['NET_ADMIN'], //cap_add: ['NET_ADMIN'],
privileged: true, privileged: true,
volumes: ['./babeld.conf:/etc/babeld.conf:ro'] volumes: ['./babeld.conf:/etc/babeld.conf:ro']
}; };
} }
host.frpcRestarts = [];
host.ocRestarts = [];
host.frpsNeeded = false; host.frpsNeeded = false;
const null_connection = '10000,null'; const null_connection = '10000,null';
const lanInterfaces = host.lanInterfaces; const lanInterfaces = host.lanInterfaces;
...@@ -294,6 +306,8 @@ class InventoryBuilder { ...@@ -294,6 +306,8 @@ class InventoryBuilder {
key: host.wgPrivateKey, key: host.wgPrivateKey,
frpsNeeded: host.frpsNeeded, frpsNeeded: host.frpsNeeded,
frpsPort: host.frpsPort, frpsPort: host.frpsPort,
ocRestarts: host.ocRestarts.length ? host.ocRestarts : false,
frpcRestarts: host.frpcRestarts.length ? host.frpcRestarts : false,
ocservNeeded: host.ocservNeeded || false, ocservNeeded: host.ocservNeeded || false,
ocservPort: host.ocservPort, ocservPort: host.ocservPort,
ocservCert: host.ocservCert || null, ocservCert: host.ocservCert || null,
...@@ -355,6 +369,8 @@ class InventoryBuilder { ...@@ -355,6 +369,8 @@ class InventoryBuilder {
const frpType = protocol === 'wgfrp' ? (this.gatewayCompare(localGateway, remoteGateway) ? 'frps' : 'frpc') : undefined; const frpType = protocol === 'wgfrp' ? (this.gatewayCompare(localGateway, remoteGateway) ? 'frps' : 'frpc') : undefined;
const ocType = protocol === 'oc' ? (this.gatewayCompareOcserv(local, remote, localGateway, remoteGateway) ? 'server' : 'client') : undefined; const ocType = protocol === 'oc' ? (this.gatewayCompareOcserv(local, remote, localGateway, remoteGateway) ? 'server' : 'client') : undefined;
const noUpdate = this.linksOnly && !(this.linksOnly.includes(remote.name) || this.linksOnly.includes(local.name)) || this.linksLimit && !(this.linksLimit.includes(remote.name) && this.linksLimit.includes(local.name));
if (frpType === 'frps' && !local.dockerServices.services.frps) { if (frpType === 'frps' && !local.dockerServices.services.frps) {
local.frpsNeeded = true; local.frpsNeeded = true;
local.dockerServices.services.frps = { local.dockerServices.services.frps = {
...@@ -367,13 +383,17 @@ class InventoryBuilder { ...@@ -367,13 +383,17 @@ class InventoryBuilder {
} }
if (frpType === 'frpc') { if (frpType === 'frpc') {
local.dockerServices.services[`frpc-${name}`] = { const containerName = `frpc-${name}`;
local.dockerServices.services[containerName] = {
restart: 'always', restart: 'always',
image: 'fatedier/frpc:v0.34.2', image: 'fatedier/frpc:v0.34.2',
network_mode: 'host', network_mode: 'host',
command: '-c /frpc.ini', command: '-c /frpc.ini',
volumes: [`./frpc-${name}.ini:/frpc.ini:ro`] volumes: [`./frpc-${name}.ini:/frpc.ini:ro`]
}; };
if (!noUpdate) {
local.frpcRestarts.push(containerName);
}
} }
if (ocType === 'server') { if (ocType === 'server') {
...@@ -383,7 +403,7 @@ class InventoryBuilder { ...@@ -383,7 +403,7 @@ class InventoryBuilder {
local.ocMetric = metric; local.ocMetric = metric;
local.dockerServices.services.ocserv = { local.dockerServices.services.ocserv = {
restart: 'always', restart: 'always',
image: 'git-registry.mycard.moe/nanahira/docker-ocserv', image: `git-registry.mycard.moe/nanahira/docker-ocserv${this.getDockerImageTag(local)}`,
network_mode: 'host', network_mode: 'host',
command: 'ocserv -f -d 1', command: 'ocserv -f -d 1',
cap_add: ['NET_ADMIN'], cap_add: ['NET_ADMIN'],
...@@ -411,9 +431,10 @@ class InventoryBuilder { ...@@ -411,9 +431,10 @@ class InventoryBuilder {
if (params.p === "tcp") { if (params.p === "tcp") {
startupCommand += ' --no-dtls'; startupCommand += ' --no-dtls';
} }
local.dockerServices.services[`openconnect-${name}`] = { const containerName = `openconnect-${name}`;
local.dockerServices.services[containerName] = {
restart: 'always', restart: 'always',
image: 'git-registry.mycard.moe/railgun/openconnect', image: `git-registry.mycard.moe/railgun/openconnect${this.getDockerImageTag(local)}`,
network_mode: 'host', network_mode: 'host',
command: ['bash', '-c', startupCommand], command: ['bash', '-c', startupCommand],
cap_add: ['NET_ADMIN'], cap_add: ['NET_ADMIN'],
...@@ -426,6 +447,9 @@ class InventoryBuilder { ...@@ -426,6 +447,9 @@ class InventoryBuilder {
'$HOME/nextgen-network/scripts:$HOME/nextgen-network/scripts:ro' '$HOME/nextgen-network/scripts:$HOME/nextgen-network/scripts:ro'
] ]
}; };
if (!noUpdate) {
local.ocRestarts.push(containerName);
}
} }
//console.log(local.name, name, mtu); //console.log(local.name, name, mtu);
...@@ -434,8 +458,6 @@ class InventoryBuilder { ...@@ -434,8 +458,6 @@ class InventoryBuilder {
console.log(`${local.name} GW ${localGateway.isp} ${inbound ? '<' : '='}=${(frpType === 'frps' || ocType === 'server') ? 's' : '='}=[${protocol}]=${(frpType === 'frpc' || ocType === 'client') ? 's' : '='}=> ${remote.name} GW ${remoteGateway.isp}`); console.log(`${local.name} GW ${localGateway.isp} ${inbound ? '<' : '='}=${(frpType === 'frps' || ocType === 'server') ? 's' : '='}=[${protocol}]=${(frpType === 'frpc' || ocType === 'client') ? 's' : '='}=> ${remote.name} GW ${remoteGateway.isp}`);
} }
const noUpdate = this.linksOnly && !(this.linksOnly.includes(remote.name) || this.linksOnly.includes(local.name)) || this.linksLimit && !(this.linksLimit.includes(remote.name) && this.linksLimit.includes(local.name));
return { return {
name, name,
metric, metric,
......
...@@ -6,9 +6,9 @@ set -e ...@@ -6,9 +6,9 @@ set -e
#read -p '确认无误后按回车继续' #read -p '确认无误后按回车继续'
cd lists #cd lists
./run.sh #./run.sh
cd .. #cd ..
mkdir -p result mkdir -p result
npm run build npm run build
......
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