UNPKG

raindancers-network

Version:
119 lines 15.7 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.IpsecTunnelPool = exports.GetTunnelAddressPair = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs = require("constructs"); function ipToInt32(ip) { const ipSplit = ip.split('.'); var ipInt = 0; ipSplit.forEach((value, index) => { var octect = value; ipInt += octect * Math.pow(2, (24 - index * 8)); }); return ipInt; } /** * Allocate a pair of /30 networks CIDRS for use in Ipsec VPN Tunnels */ class GetTunnelAddressPair extends constructs.Construct { /** * * @param scope scope in which this resource is created * @param id scope id of the resoruce * @param props resource properties */ constructor(scope, id, props) { super(scope, id); const assignedCidrs = []; for (let i = 1; i <= 2; i++) { const allocation = new aws_cdk_lib_1.aws_ec2.CfnIPAMAllocation(this, `IPAMAllocationtunnel${i}`, { ipamPoolId: props.ipamPoolId, description: `vpn tunnel ${i} to ${props.name}`, netmaskLength: 30, }); const tunnelId = `tunnel${i}${props.name}`; const allocationCidr = new aws_cdk_lib_1.custom_resources.AwsCustomResource(this, tunnelId, { onCreate: { service: 'EC2', action: 'getIpamPoolAllocations', parameters: { IpamPoolId: props.ipamPoolId, IpamPoolAllocationId: allocation.attrIpamPoolAllocationId, }, physicalResourceId: aws_cdk_lib_1.custom_resources.PhysicalResourceId.of(tunnelId), }, policy: aws_cdk_lib_1.custom_resources.AwsCustomResourcePolicy.fromSdkCalls({ resources: aws_cdk_lib_1.custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE, }), }); assignedCidrs.push(allocationCidr.getResponseField('IpamPoolAllocations.0.Cidr')); } this.assignedCidrPair = assignedCidrs; } } exports.GetTunnelAddressPair = GetTunnelAddressPair; _a = JSII_RTTI_SYMBOL_1; GetTunnelAddressPair[_a] = { fqn: "raindancers-network.ipam.GetTunnelAddressPair", version: "1.29.3" }; /** * Creates an IPAM pool to assign address's for IPsec VPNS */ class IpsecTunnelPool extends constructs.Construct { /** * * @param scope scope in which this resource is defined * @param id id of the resource * @param props resource properties */ constructor(scope, id, props) { super(scope, id); // check to see that cidr starts with 169.254 if (!(props.cidr.startsWith('169.254'))) { throw new Error('Tunnel Cidrs must be in teh 169.254/16 range'); } const netmask = props.cidr.split('/')[1]; // check to see that the mask is between /24 and /29 if (!(netmask >= 24 && netmask <= 29)) { throw new Error('Tunnels Mask must be in the range 24 to 29 inclusive '); } // check to see if the the cidr overlaps the reserved address's const networkAddress = ipToInt32(props.cidr.split('/')[0]); const reservedTunnelAddress = [ '169.254.0.0/30', '169.254.1.0/30', '169.254.2.0/30', '169.254.3.0/30', '169.254.4.0/30', '169.254.5.0/30', '169.254.169.252/30', ]; reservedTunnelAddress.forEach((checkAddr) => { const rsvAddr = ipToInt32(checkAddr.split('/')[0]); if (rsvAddr >= networkAddress && rsvAddr <= networkAddress + Math.pow(2, 32 - netmask)) { throw new Error(`The cidr ${props.cidr} includes the reserved range ${checkAddr}`); } }); this.ipampool = new aws_cdk_lib_1.aws_ec2.CfnIPAMPool(this, 'IPAMPool', { addressFamily: 'ipv4', ipamScopeId: props.ipamScopeId, allocationDefaultNetmaskLength: 30, allocationMaxNetmaskLength: 30, allocationMinNetmaskLength: 30, description: props.description, provisionedCidrs: [ { cidr: props.cidr, }, ], tags: [{ key: 'Name', value: props.name, }], }); } } exports.IpsecTunnelPool = IpsecTunnelPool; _b = JSII_RTTI_SYMBOL_1; IpsecTunnelPool[_b] = { fqn: "raindancers-network.ipam.IpsecTunnelPool", version: "1.29.3" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pcGFtL2lwYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FJcUI7QUFFckIseUNBQXlDO0FBRXpDLFNBQVMsU0FBUyxDQUFDLEVBQVU7SUFDM0IsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixJQUFJLEtBQUssR0FBVyxDQUFDLENBQUM7SUFDdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNoQyxJQUFJLE1BQU0sR0FBVyxLQUEwQixDQUFDO1FBQ2hELEtBQUssSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFjRDs7R0FFRztBQUVILE1BQWEsb0JBQXFCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFNNUQ7Ozs7O1NBS0U7SUFDRixZQUFZLEtBQTJCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3BGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEIsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBRW5DLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsSUFBRyxDQUFDLEVBQUcsQ0FBQyxFQUFFLEVBQUU7WUFFekIsTUFBTSxVQUFVLEdBQUcsSUFBSSxxQkFBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDNUIsV0FBVyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JB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VyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLDhCQUE4QixFQUFFLEVBQUU7WUFDbEMsMEJBQTBCLEVBQUUsRUFBRTtZQUM5QiwwQkFBMEIsRUFBRSxFQUFFO1lBQzlCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixnQkFBZ0IsRUFBRTtnQkFDaEI7b0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNqQjthQUNGO1lBQ0QsSUFBSSxFQUFFLENBQUM7b0JBQ0wsR0FBRyxFQUFFLE1BQU07b0JBQ1gsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNsQixDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFwRUgsMENBc0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYXdzX2VjMiBhcyBlYzIsXG4gIGN1c3RvbV9yZXNvdXJjZXMgYXMgY3IsXG59XG4gIGZyb20gJ2F3cy1jZGstbGliJztcblxuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcblxuZnVuY3Rpb24gaXBUb0ludDMyKGlwOiBzdHJpbmcpIHtcbiAgY29uc3QgaXBTcGxpdCA9IGlwLnNwbGl0KCcuJyk7XG4gIHZhciBpcEludDogbnVtYmVyID0gMDtcbiAgaXBTcGxpdC5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcblx0ICB2YXIgb2N0ZWN0OiBudW1iZXIgPSB2YWx1ZSBhcyB1bmtub3duIGFzIG51bWJlcjtcblx0ICBpcEludCArPSBvY3RlY3QgKiBNYXRoLnBvdygyLCAoMjQtaW5kZXgqOCkpO1xuICB9KTtcblxuICByZXR1cm4gaXBJbnQ7XG59XG5cbi8qKlxuKiBQcm9wZXJ0aWVzIGZvciBvYnRhaW5pbmcgYW4gSVBBTSBhc3NpZ25lZCBhZGRyZXNzIHBhaXIgZm9yIHVzZSBvbiBJUHNlYyBWUE4gVHVubmVscy5cbiovXG5leHBvcnQgaW50ZXJmYWNlIEdldFR1bm5lbEFkZHJlc3NQYWlyUHJvcHMge1xuXG4gIC8qKiBUaGUgSVBBTSBQb29sIElkIGZyb20gd2hpY2ggdGhlIGFzc2dpbm1lbnQgd2lsbCBiZSBtYWRlIGZyb20gICovXG4gIHJlYWRvbmx5IGlwYW1Qb29sSWQ6IHN0cmluZztcblxuICAvKiogVGhlIE5hbWUgdXNlZCBieSBJUEFNIHRvIHJlY29yZCB0aGUgYWxsb2NhdGlvbiAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFsbG9jYXRlIGEgcGFpciBvZiAvMzAgbmV0d29ya3MgQ0lEUlMgZm9yIHVzZSBpbiBJcHNlYyBWUE4gVHVubmVsc1xuICovXG5cbmV4cG9ydCBjbGFzcyBHZXRUdW5uZWxBZGRyZXNzUGFpciBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqXG5cdCAqIHJldHVybnMgMiBjaWRyIGJsb2NrcyBhcyBhbiBhcnJheSB0byBiZSB1c2VkIGJ5IGFuIElQc2VjIFR1bm5lbFxuXHQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc2lnbmVkQ2lkclBhaXI6IHN0cmluZ1tdO1xuXG4gIC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gc2NvcGUgc2NvcGUgaW4gd2hpY2ggdGhpcyByZXNvdXJjZSBpcyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBpZCBzY29wZSBpZCBvZiB0aGUgcmVzb3J1Y2Vcblx0ICogQHBhcmFtIHByb3BzIHJlc291cmNlIHByb3BlcnRpZXNcblx0ICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEdldFR1bm5lbEFkZHJlc3NQYWlyUHJvcHMpIHtcblx0ICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgYXNzaWduZWRDaWRyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAobGV0IGk9MTsgaSA8PTIgOyBpKyspIHtcblxuICAgICAgY29uc3QgYWxsb2NhdGlvbiA9IG5ldyBlYzIuQ2ZuSVBBTUFsbG9jYXRpb24odGhpcywgYElQQU1BbGxvY2F0aW9udHVubmVsJHtpfWAsIHtcbiAgICAgICAgaXBhbVBvb2xJZDogcHJvcHMuaXBhbVBvb2xJZCxcbiAgICAgICAgZGVzY3JpcHRpb246IGB2cG4gdHVubmVsICR7aX0gdG8gJHtwcm9wcy5uYW1lfWAsXG4gICAgICAgIG5ldG1hc2tMZW5ndGg6IDMwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR1bm5lbElkID0gYHR1bm5lbCR7aX0ke3Byb3BzLm5hbWV9YDtcblxuICAgICAgY29uc3QgYWxsb2NhdGlvbkNpZHIgPSBuZXcgY3IuQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgdHVubmVsSWQsIHtcbiAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiAnRUMyJyxcbiAgICAgICAgICBhY3Rpb246ICdnZXRJcGFtUG9vbEFsbG9jYXRpb25zJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBJcGFtUG9vbElkOiBwcm9wcy5pcGFtUG9vbElkLFxuICAgICAgICAgICAgSXBhbVBvb2xBbGxvY2F0aW9uSWQ6IGFsbG9jYXRpb24uYXR0cklwYW1Qb29sQWxsb2NhdGlvbklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjci5QaHlzaWNhbFJlc291cmNlSWQub2YodHVubmVsSWQpLFxuICAgICAgICB9LFxuICAgICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5BTllfUkVTT1VSQ0UsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2lnbmVkQ2lkcnMucHVzaChhbGxvY2F0aW9uQ2lkci5nZXRSZXNwb25zZUZpZWxkKCdJcGFtUG9vbEFsbG9jYXRpb25zLjAuQ2lkcicpKTtcbiAgICB9XG5cbiAgICB0aGlzLmFzc2lnbmVkQ2lkclBhaXIgPSBhc3NpZ25lZENpZHJzO1xuXG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIElQQU0gUG9vbCBzcGVjaWZpY2FsbHkgZm9yIElQU2VjIFZQTiBUdW5uZWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBzZWNUdW5uZWxQb29sUHJvcHMge1xuXG4gIC8qKiBUaGUgSVBBTSBTY29wZSBJZCB0byB1c2UgdG8gY3JlYXRlIHRoZSBQb29sICovXG4gIHJlYWRvbmx5IGlwYW1TY29wZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBDaWRyIHJhbmdlIGZvciBwb29scyB0byBiZSBjcmVhdGVkIGZyb21cblx0ICogICAgICBlZywgMTY5LjI1NC4xMDAuMC8yN1xuXHQgKiBUaGUgY2lkciBtdXN0IGJlIGluIHRoZSAxNjkuMjU0LjAuMC8xNiByYW5nZSBhbmRcblx0ICogbXVzdCBiZSBhIG1pbmltdW0gb2YgYSAvMjkgYW5kIGEgbWF4aW11bSBvZiAvMjQuXG5cdCAqXG5cdCAqIEl0IG11c3QgYWxzbyBub3Qgb3ZlcmxhcCB0aGUgQVdTIHJlc2VydmVkIHJhbmdlcy4gVFxuXHQgKi9cbiAgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xuXG4gIC8qKiB0aGUgbmFtZSB1c2VkIGJ5IElQQU0gdG8gaWRlbnRpZnkgdGhlIHBvb2wgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiB0aGUgZGVzY3JpcHRpb24gdXNlZCBieSBJUEFNIHRvIGRlc2NyaWJlIHRoZSBwb29sICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBJUEFNIHBvb2wgdG8gYXNzaWduIGFkZHJlc3MncyBmb3IgSVBzZWMgVlBOU1xuICovXG5leHBvcnQgY2xhc3MgSXBzZWNUdW5uZWxQb29sIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuXG4gIC8qKlxuXHQgKiByZXR1cm5zIHRoZSBjcmVhdGVkIGlwYW0gUG9vbFxuXHQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwYW1wb29sOiBlYzIuQ2ZuSVBBTVBvb2w7XG5cbiAgLyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBzY29wZSBzY29wZSBpbiB3aGljaCB0aGlzIHJlc291cmNlIGlzIGRlZmluZWRcblx0ICogQHBhcmFtIGlkIGlkIG9mIHRoZSByZXNvdXJjZVxuXHQgKiBAcGFyYW0gcHJvcHMgcmVzb3VyY2UgcHJvcGVydGllc1xuXHQgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSXBzZWNUdW5uZWxQb29sUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG5cbiAgICAvLyBjaGVjayB0byBzZWUgdGhhdCBjaWRyIHN0YXJ0cyB3aXRoIDE2OS4yNTRcbiAgICBpZiAoIShwcm9wcy5jaWRyLnN0YXJ0c1dpdGgoJzE2OS4yNTQnKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHVubmVsIENpZHJzIG11c3QgYmUgaW4gdGVoIDE2OS4yNTQvMTYgcmFuZ2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXRtYXNrID0gcHJvcHMuY2lkci5zcGxpdCgnLycpWzFdIGFzIHVua25vd24gYXMgbnVtYmVyO1xuXG5cbiAgICAvLyBjaGVjayB0byBzZWUgdGhhdCB0aGUgbWFzayBpcyBiZXR3ZWVuIC8yNCBhbmQgLzI5XG4gICAgaWYgKCEobmV0bWFzayA+PSAyNCAmJiBuZXRtYXNrIDw9IDI5ICkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHVubmVscyBNYXNrIG11c3QgYmUgaW4gdGhlIHJhbmdlIDI0IHRvIDI5IGluY2x1c2l2ZSAnKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIHRoZSBjaWRyIG92ZXJsYXBzIHRoZSByZXNlcnZlZCBhZGRyZXNzJ3NcbiAgICBjb25zdCBuZXR3b3JrQWRkcmVzcyA9IGlwVG9JbnQzMihwcm9wcy5jaWRyLnNwbGl0KCcvJylbMF0pO1xuXG4gICAgY29uc3QgcmVzZXJ2ZWRUdW5uZWxBZGRyZXNzID0gW1xuXHRcdCAgJzE2OS4yNTQuMC4wLzMwJyxcblx0XHQgICcxNjkuMjU0LjEuMC8zMCcsXG5cdFx0ICAnMTY5LjI1NC4yLjAvMzAnLFxuXHRcdCAgJzE2OS4yNTQuMy4wLzMwJyxcblx0XHQgICcxNjkuMjU0LjQuMC8zMCcsXG5cdFx0ICAnMTY5LjI1NC41LjAvMzAnLFxuXHRcdCAgJzE2OS4yNTQuMTY5LjI1Mi8zMCcsXG4gICAgXTtcblxuICAgIHJlc2VydmVkVHVubmVsQWRkcmVzcy5mb3JFYWNoKChjaGVja0FkZHIpID0+IHtcbiAgICAgIGNvbnN0IHJzdkFkZHIgPSBpcFRvSW50MzIoY2hlY2tBZGRyLnNwbGl0KCcvJylbMF0pO1xuICAgICAgaWYgKHJzdkFkZHIgPj0gbmV0d29ya0FkZHJlc3MgJiYgcnN2QWRkciA8PSBuZXR3b3JrQWRkcmVzcyArIE1hdGgucG93KDIsIDMyLW5ldG1hc2spKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGNpZHIgJHtwcm9wcy5jaWRyfSBpbmNsdWRlcyB0aGUgcmVzZXJ2ZWQgcmFuZ2UgJHtjaGVja0FkZHJ9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIHRoaXMuaXBhbXBvb2wgPSBuZXcgZWMyLkNmbklQQU1Qb29sKHRoaXMsICdJUEFNUG9vbCcsIHtcbiAgICAgIGFkZHJlc3NGYW1pbHk6ICdpcHY0JyxcbiAgICAgIGlwYW1TY29wZUlkOiBwcm9wcy5pcGFtU2NvcGVJZCxcbiAgICAgIGFsbG9jYXRpb25EZWZhdWx0TmV0bWFza0xlbmd0aDogMzAsXG4gICAgICBhbGxvY2F0aW9uTWF4TmV0bWFza0xlbmd0aDogMzAsXG4gICAgICBhbGxvY2F0aW9uTWluTmV0bWFza0xlbmd0aDogMzAsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBwcm92aXNpb25lZENpZHJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjaWRyOiBwcm9wcy5jaWRyLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRhZ3M6IFt7XG4gICAgICAgIGtleTogJ05hbWUnLFxuICAgICAgICB2YWx1ZTogcHJvcHMubmFtZSxcbiAgICAgIH1dLFxuICAgIH0pO1xuICB9XG5cbn0iXX0=