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:
22
index.js
22
index.js
@@ -65,6 +65,14 @@ const params = yargs
|
|||||||
.nargs('i', 0)
|
.nargs('i', 0)
|
||||||
.describe('i', 'Ignore delegated prefixes')
|
.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']);
|
.demandOption(['o']);
|
||||||
})
|
})
|
||||||
.example('$0 generate -a 2914 -o prefixes.yml', 'Generate prefixes for AS2914')
|
.example('$0 generate -a 2914 -o prefixes.yml', 'Generate prefixes for AS2914')
|
||||||
@@ -77,8 +85,9 @@ const params = yargs
|
|||||||
|
|
||||||
switch(params._[0]) {
|
switch(params._[0]) {
|
||||||
case "generate":
|
case "generate":
|
||||||
const generatePrefixes = require("./generatePrefixesList");
|
const generatePrefixes = require("./src/generatePrefixesList");
|
||||||
let prefixes = null;
|
let prefixes = null;
|
||||||
|
let monitoredASes = false;
|
||||||
if (params.pf) {
|
if (params.pf) {
|
||||||
throw new Error("The argument --pf has been deprecated. Use -l instead");
|
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(
|
generatePrefixes(
|
||||||
(params.a) ? params.a.toString().split(",") : null,
|
(params.a) ? params.a.toString().split(",") : null,
|
||||||
params.o,
|
params.o,
|
||||||
(params.e || "").split(","),
|
(params.e || "").split(","),
|
||||||
params.i || false,
|
params.i || false,
|
||||||
prefixes
|
prefixes,
|
||||||
|
monitoredASes
|
||||||
);
|
);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@@ -4,8 +4,9 @@ import yaml from "js-yaml";
|
|||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
const batchPromises = require('batch-promises');
|
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 generateList = {};
|
||||||
|
const allOrigins = {};
|
||||||
let someNotValidatedPrefixes = false;
|
let someNotValidatedPrefixes = false;
|
||||||
|
|
||||||
if (!asnList && !prefixes) {
|
if (!asnList && !prefixes) {
|
||||||
@@ -44,7 +45,7 @@ module.exports = function generatePrefixes(asnList, outputFile, exclude, exclude
|
|||||||
};
|
};
|
||||||
|
|
||||||
const getAnnouncedMoreSpecifics = (prefix) => {
|
const getAnnouncedMoreSpecifics = (prefix) => {
|
||||||
console.log("Processing " + prefix);
|
console.log("Generating monitoring rule for", prefix);
|
||||||
const url = brembo.build("https://stat.ripe.net", {
|
const url = brembo.build("https://stat.ripe.net", {
|
||||||
path: ["data", "related-prefixes", "data.json"],
|
path: ["data", "related-prefixes", "data.json"],
|
||||||
params: {
|
params: {
|
||||||
@@ -84,6 +85,10 @@ module.exports = function generatePrefixes(asnList, outputFile, exclude, exclude
|
|||||||
if (asns.length) {
|
if (asns.length) {
|
||||||
const origin = (asns && asns.length) ? asns : [asn];
|
const origin = (asns && asns.length) ? asns : [asn];
|
||||||
|
|
||||||
|
for (let o of origin) {
|
||||||
|
allOrigins[o] = true;
|
||||||
|
}
|
||||||
|
|
||||||
generateList[prefix] = {
|
generateList[prefix] = {
|
||||||
description: description || "No description provided",
|
description: description || "No description provided",
|
||||||
asn: origin.map(i => parseInt(i)),
|
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);
|
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)))
|
return Promise.all(Object.keys(generateList).map(prefix => validatePrefix(generateList[prefix].asn[0], prefix)))
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
console.log("ROA check failed due to error", 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);
|
const yamlContent = yaml.dump(generateList);
|
||||||
fs.writeFileSync(outputFile, yamlContent);
|
fs.writeFileSync(outputFile, yamlContent);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user