diff --git a/index.js b/index.js index 6693f0a..b30587e 100644 --- a/index.js +++ b/index.js @@ -65,6 +65,14 @@ const params = yargs .nargs('i', 0) .describe('i', 'Ignore delegated prefixes') + .alias('s', 'monitor-as') + .nargs('s', 1) + .describe('s', 'List of monitored ASes to be added for generic monitoring in options.monitorASns.') + + .alias('m', 'monitor-as-origin') + .nargs('m', 0) + .describe('m', 'Automatically generate list of monitored ASes (options.monitorASns) from prefix origins.') + .demandOption(['o']); }) .example('$0 generate -a 2914 -o prefixes.yml', 'Generate prefixes for AS2914') @@ -77,8 +85,9 @@ const params = yargs switch(params._[0]) { case "generate": - const generatePrefixes = require("./generatePrefixesList"); + const generatePrefixes = require("./src/generatePrefixesList"); let prefixes = null; + let monitoredASes = false; if (params.pf) { throw new Error("The argument --pf has been deprecated. Use -l instead"); } @@ -94,12 +103,21 @@ switch(params._[0]) { } } + if (params.s && params.m) { + throw new Error("You can specify -s or -m, not both"); + } else if (params.s) { + monitoredASes = (params.s || "").split(","); + } else if (params.m) { + monitoredASes = true; + } + generatePrefixes( (params.a) ? params.a.toString().split(",") : null, params.o, (params.e || "").split(","), params.i || false, - prefixes + prefixes, + monitoredASes ); break; diff --git a/src/generatePrefixesList.js b/src/generatePrefixesList.js index 019e6a7..d4b2793 100644 --- a/src/generatePrefixesList.js +++ b/src/generatePrefixesList.js @@ -4,8 +4,9 @@ import yaml from "js-yaml"; import fs from "fs"; const batchPromises = require('batch-promises'); -module.exports = function generatePrefixes(asnList, outputFile, exclude, excludeDelegated, prefixes) { +module.exports = function generatePrefixes(asnList, outputFile, exclude, excludeDelegated, prefixes, monitoredASes) { const generateList = {}; + const allOrigins = {}; let someNotValidatedPrefixes = false; if (!asnList && !prefixes) { @@ -44,7 +45,7 @@ module.exports = function generatePrefixes(asnList, outputFile, exclude, exclude }; const getAnnouncedMoreSpecifics = (prefix) => { - console.log("Processing " + prefix); + console.log("Generating monitoring rule for", prefix); const url = brembo.build("https://stat.ripe.net", { path: ["data", "related-prefixes", "data.json"], params: { @@ -84,6 +85,10 @@ module.exports = function generatePrefixes(asnList, outputFile, exclude, exclude if (asns.length) { const origin = (asns && asns.length) ? asns : [asn]; + for (let o of origin) { + allOrigins[o] = true; + } + generateList[prefix] = { description: description || "No description provided", asn: origin.map(i => parseInt(i)), @@ -183,13 +188,32 @@ module.exports = function generatePrefixes(asnList, outputFile, exclude, exclude console.log("Cannot download more specific prefixes", e); }) }) - .then(() => { + .then(() => { // Check return Promise.all(Object.keys(generateList).map(prefix => validatePrefix(generateList[prefix].asn[0], prefix))) .catch((e) => { console.log("ROA check failed due to error", e); }) }) - .then(() => { + .then(() => { // Add the options for monitorASns + + const generateMonitoredAsObject = function (list) { + generateList.options = generateList.options || {}; + generateList.options.monitorASns = generateList.options.monitorASns || {}; + for (let monitoredAs of list) { + console.log("Generating generic monitoring rule for AS", monitoredAs); + generateList.options.monitorASns[monitoredAs] = { + group: 'default' + }; + } + }; + if (monitoredASes === true) { + generateMonitoredAsObject(Object.keys(allOrigins)); + } else if (monitoredASes.length) { + generateMonitoredAsObject(monitoredASes); + } + // Otherwise nothing + }) + .then(() => { // write everything into the file const yamlContent = yaml.dump(generateList); fs.writeFileSync(outputFile, yamlContent);