Commit b4992960 authored by nanahira's avatar nanahira

gost

parent 2280142f
...@@ -144,6 +144,12 @@ ...@@ -144,6 +144,12 @@
dest: '{{ansible_user_dir}}/nextgen-network/services/babeld.conf' dest: '{{ansible_user_dir}}/nextgen-network/services/babeld.conf'
#notify: restart_babeld #notify: restart_babeld
when: not noBird and not systemBird when: not noBird and not systemBird
- name: gost.json
copy:
src: '{{gostConfig | to_nice_json}}'
dest: '{{ansible_user_dir}}/nextgen-network/services/gost.json'
notify: restart_gost
when: installGost
- name: monitor route plans - name: monitor route plans
template: template:
src: route-plans.j2 src: route-plans.j2
...@@ -231,6 +237,13 @@ ...@@ -231,6 +237,13 @@
services: services:
- ocserv - ocserv
when: not noBird when: not noBird
- name: restart_gost
docker_compose:
project_src: '{{ansible_user_dir}}/nextgen-network/services'
restarted: true
services:
- gost
when: installGost
- name: restart_openconnect - name: restart_openconnect
docker_compose: docker_compose:
project_src: '{{ansible_user_dir}}/nextgen-network/services' project_src: '{{ansible_user_dir}}/nextgen-network/services'
......
...@@ -27,6 +27,18 @@ interface GatewayGroup extends Record<string, any> { ...@@ -27,6 +27,18 @@ interface GatewayGroup extends Record<string, any> {
destMark: number; destMark: number;
} }
interface GostRoute {
Retries?: string;
ServeNodes: string[];
ChainNodes?: string[];
Mark?: number
}
interface GostConfig extends Partial<GostRoute> {
Routes: GostRoute[];
Debug?: boolean;
}
type CommonEntry = Record<string, any>; type CommonEntry = Record<string, any>;
class InventoryBuilder { class InventoryBuilder {
...@@ -47,7 +59,7 @@ class InventoryBuilder { ...@@ -47,7 +59,7 @@ 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) { getDockerImageTag(host: CommonEntry) {
if (host.arch && host.arch.length) { if (host.arch && host.arch.length) {
return `:master-${host.arch}`; return `:master-${host.arch}`;
} else { } else {
...@@ -174,7 +186,7 @@ class InventoryBuilder { ...@@ -174,7 +186,7 @@ class InventoryBuilder {
} }
return addresses.join(" "); return addresses.join(" ");
} }
isGatewayGroupContains(gatewayGroup: GatewayGroup, host: any) { isGatewayGroupContains(gatewayGroup: GatewayGroup, host: CommonEntry) {
const locationPrefixes = gatewayGroup.locationPrefix.split(","); const locationPrefixes = gatewayGroup.locationPrefix.split(",");
const excludeRouters = gatewayGroup.excludeRouters.split(","); const excludeRouters = gatewayGroup.excludeRouters.split(",");
const includeRouters = gatewayGroup.includeRouters.split(","); const includeRouters = gatewayGroup.includeRouters.split(",");
...@@ -196,11 +208,11 @@ class InventoryBuilder { ...@@ -196,11 +208,11 @@ class InventoryBuilder {
} }
return false; return false;
} }
getAddressesFromGatewayGroup(gatewayGroup: GatewayGroup, hosts: any[]) { getAddressesFromGatewayGroup(gatewayGroup: GatewayGroup, hosts: CommonEntry[]) {
const suitableHosts = hosts.filter(host => this.isGatewayGroupContains(gatewayGroup, host)); const suitableHosts = hosts.filter(host => this.isGatewayGroupContains(gatewayGroup, host));
return suitableHosts.map(host => host.address); return suitableHosts.map(host => host.address);
} }
getRoutePlansFromGatewayGroups(host: any) { getRoutePlansFromGatewayGroups(host: CommonEntry) {
const allOtherHosts = Object.values(this.hosts).filter(h => h !== host.name) const allOtherHosts = Object.values(this.hosts).filter(h => h !== host.name)
const routePlans = this.gatewayGroups.filter(group => !this.isGatewayGroupContains(group, host)).map(group => { const routePlans = this.gatewayGroups.filter(group => !this.isGatewayGroupContains(group, host)).map(group => {
const addresses = this.getAddressesFromGatewayGroup(group, allOtherHosts); const addresses = this.getAddressesFromGatewayGroup(group, allOtherHosts);
...@@ -214,7 +226,7 @@ class InventoryBuilder { ...@@ -214,7 +226,7 @@ class InventoryBuilder {
return routePlans; return routePlans;
} }
getHostConnectionInfo(host) { getHostConnectionInfo(host: CommonEntry) {
return { return {
ansible_ssh_host: host.host, ansible_ssh_host: host.host,
ansible_ssh_user: host.user, ansible_ssh_user: host.user,
...@@ -225,7 +237,7 @@ class InventoryBuilder { ...@@ -225,7 +237,7 @@ class InventoryBuilder {
} }
} }
async host_vars(host) { async host_vars(host: CommonEntry) {
const connections = []; const connections = [];
host.dockerServices = { host.dockerServices = {
version: '2.4', version: '2.4',
...@@ -250,6 +262,26 @@ class InventoryBuilder { ...@@ -250,6 +262,26 @@ class InventoryBuilder {
volumes: ['./babeld.conf:/etc/babeld.conf:ro'] volumes: ['./babeld.conf:/etc/babeld.conf:ro']
}; };
} }
const gostConfig: GostConfig = {
Routes: Object.values(this.gateways[host.name]).filter(gateway => !gateway.hidden).map(gateway => ({
ServeNodes: [`red://${host.address}:${gateway.redirectPort}`],
Mark: gateway.selectionMark as number,
}))
};
if (gostConfig.Routes.length) {
host.gostConfig = gostConfig;
host.dockerServices.services.gost = {
restart: 'always',
image: `git-registry.mycard.moe/nanahira/gost${this.getDockerImageTag(host)}`,
network_mode: 'host',
privileged: true,
volumes: ['./gost.json:/etc/gost/gost.json:ro'],
command: '-C /etc/gost/gost.json'
};
}
host.frpcRestarts = []; host.frpcRestarts = [];
host.ocRestarts = []; host.ocRestarts = [];
host.frpsNeeded = false; host.frpsNeeded = false;
...@@ -321,6 +353,8 @@ class InventoryBuilder { ...@@ -321,6 +353,8 @@ class InventoryBuilder {
dockerServices: host.dockerServices, dockerServices: host.dockerServices,
routePlans, routePlans,
iptables_type: host.iptables || 'auto', iptables_type: host.iptables || 'auto',
gostConfig,
installGost: !!gostConfig,
}; };
} }
......
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