1
0
mirror of https://github.com/nttgin/BGPalerter.git synced 2024-05-19 06:50:08 +00:00

added support for auto generation of monitored ASns

This commit is contained in:
Massimo Candela
2019-11-28 17:56:33 +01:00
parent 951ba0f0a2
commit a0bcc1fbce
2 changed files with 48 additions and 6 deletions

View File

@@ -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;

View File

@@ -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);