diff --git a/package-lock.json b/package-lock.json index e5b8f1e..b7886eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "fast-xml-parser": "^3.17.6", "fluent-json-schema": "^2.0.3", "got": "^11.8.1", + "ip-address": "^7.1.0", "js-yaml": "^3.14.1", "reflect-metadata": "^0.1.13", "typedi": "^0.10.0", @@ -3832,6 +3833,23 @@ "url": "https://opencollective.com/ioredis" } }, + "node_modules/ip-address": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-7.1.0.tgz", + "integrity": "sha512-V9pWC/VJf2lsXqP7IWJ+pe3P1/HCYGBMZrrnT62niLGjAfCbeiwXMUxaeHvnVlz19O27pvXP4azs+Pj/A0x+SQ==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "1.1.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4149,6 +4167,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -16241,6 +16264,22 @@ "standard-as-callback": "^2.0.1" } }, + "ip-address": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-7.1.0.tgz", + "integrity": "sha512-V9pWC/VJf2lsXqP7IWJ+pe3P1/HCYGBMZrrnT62niLGjAfCbeiwXMUxaeHvnVlz19O27pvXP4azs+Pj/A0x+SQ==", + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -16477,6 +16516,11 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", diff --git a/package.json b/package.json index 5e06e41..6c8dd20 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "fast-xml-parser": "^3.17.6", "fluent-json-schema": "^2.0.3", "got": "^11.8.1", + "ip-address": "^7.1.0", "js-yaml": "^3.14.1", "reflect-metadata": "^0.1.13", "typedi": "^0.10.0", diff --git a/src/Modules/IPAM/IPAMConfigController.ts b/src/Modules/IPAM/IPAMConfigController.ts index acae042..52c9e30 100644 --- a/src/Modules/IPAM/IPAMConfigController.ts +++ b/src/Modules/IPAM/IPAMConfigController.ts @@ -2,7 +2,7 @@ import { PathLike } from 'fs'; import { readFile } from 'fs/promises'; import { load } from 'js-yaml'; -import { Service } from 'typedi'; +import Container, { Service } from 'typedi'; import { logger, LogMode } from '../../Library/Logger'; import { setContainer } from '../../Utils/Containers'; import { isObjectType } from '../../Utils/isTypes'; @@ -166,6 +166,8 @@ export class IPAMConfigController { const circuits = this.processCircuits(ipamConfigFile.circuits); const networks = this.processNetworks(ipamConfigFile.networks); + Container.set('networks', networks); + const ipam = new IPAM({ circuitLocations, circuits, @@ -174,8 +176,12 @@ export class IPAMConfigController { networks, }); - for (const network of ipam.networks) { - network.hosts.map((networkHost) => console.log(networkHost.coreDevice)); + const dns1Network = ipam.networks.find( + ({ prefix }) => prefix === '64.184.193.0/30', + ); + + if (dns1Network) { + console.log(dns1Network.IPv4); } return; diff --git a/src/Modules/Networks/Network.ts b/src/Modules/Networks/Network.ts index ab688f5..be3228e 100644 --- a/src/Modules/Networks/Network.ts +++ b/src/Modules/Networks/Network.ts @@ -5,11 +5,16 @@ import { Circuit } from '../Circuits/Circuit'; import { Contact } from '../CommunityContacts/CommunityContact'; import { Network as IPAMNetwork } from '../IPAM/IPAMConfig.gen'; import { NetworkHost } from './NetworkHost'; +import { Address4 } from 'ip-address'; @Service() export class Network implements IPAMNetwork { public prefix: string; + public get IPv4(): Address4 { + return new Address4(this.prefix); + } + public description: string; public circuitId?: string; diff --git a/src/Modules/Networks/NetworkController.ts b/src/Modules/Networks/NetworkController.ts new file mode 100644 index 0000000..c00fe04 --- /dev/null +++ b/src/Modules/Networks/NetworkController.ts @@ -0,0 +1,16 @@ +// src/Modules/Networks/NetworkController.ts +import { Inject, Service } from 'typedi'; +import { Network } from './Network'; +import { Address4 } from 'ip-address'; + +@Service() +export class NetworkController { + @Inject('networks') + public networks: Network[]; + + public findIP(ipAddress: Address4): Network[] { + return this.networks.filter((network) => + ipAddress.isInSubnet(network.IPv4), + ); + } +} diff --git a/src/Utils/Networks.ts b/src/Utils/Networks.ts new file mode 100644 index 0000000..93847c7 --- /dev/null +++ b/src/Utils/Networks.ts @@ -0,0 +1,15 @@ +// src/Utils/Networks.ts +import { Network } from '../Modules/Networks/Network'; + +/** + * Returns the smallest child subnet of an array of networks, intended to be used + * on an array containing a tree to retrieve the intended subnet + * @param networks Array of networks. Intended to be an array of networks within a "tree" + * + * @returns The Network with the smallest subnet size + */ +export function getSmallestSubnet(networks: Network[]): Network { + return networks.reduce((previous, current) => + current.IPv4.subnetMask >= previous.IPv4.subnetMask ? current : previous, + ); +} diff --git a/src/index.ts b/src/index.ts index ed44a58..2914507 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,23 @@ // src/index.ts +import 'reflect-metadata'; import { timeout } from './Utils/timeout'; import { logger, LogMode } from './Library/Logger'; import { ipamConfigController } from './Modules/IPAM/IPAMConfigController'; +import Container from 'typedi'; +import { NetworkController } from './Modules/Networks/NetworkController'; +import { Address4 } from 'ip-address'; +import { getSmallestSubnet } from './Utils/Networks'; -const config = ipamConfigController.loadFile('IPAM.yaml'); +await ipamConfigController.loadFile('IPAM.yaml'); -console.log(config); +const networkController = Container.get(NetworkController); + +console.log('Parsing IP'); + +const ddosIP = new Address4('66.165.222.177/32'); +const networks = networkController.findIP(ddosIP); + +console.log('Lowest Network: ', getSmallestSubnet(networks)); /* interface Country { name: string;