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

introduced option append for generate-prefix

This commit is contained in:
Massimo Candela
2020-07-31 02:54:38 +02:00
parent 2461cc5e73
commit ed5c9a4fdd
4 changed files with 48 additions and 7 deletions

View File

@ -23,6 +23,7 @@ Below the list of possible parameters. **Remember to prepend them with a `--` in
| -s | A list of ASns to be monitored. See [monitorASns](#monitorASns) for more information | A comma separated list of integer | 2914,3333 | No |
| -m | Monitor all ASns which are origin of at least one of the monitored prefixes. This option is the same of `-s` except that the list of ASns is automatically generated by detecting the origin AS of all the monitored prefixes. See [monitorASns](#monitorASns) for more information | Nothing | | No |
| -x | HTTP/HTTPS proxy server to use | A string | http://username:password@proxy.example.org:8080 | No |
| -A | Append the new configuration to the old one. E.g. you can use this option to add another AS. | Nothing | | No |
| -D | Enable debug mode. All queries executed in background will be shown. | Nothing | | No |
| -H | Use historical visibility data for generating prefix list (prefixes visible in the last week). Useful in case the prefix generation process returns an empty dataset. | Nothing | | No |

View File

@ -100,6 +100,10 @@ const params = yargs
.nargs('g', 1)
.describe('x', 'Define a user group for all the generated rules.')
.alias('A', 'append')
.nargs('A', 0)
.describe('A', 'Append the new configuration to the previous one.')
.alias('D', 'debug')
.nargs('D', 0)
.describe('D', 'Provide verbose output for debugging')
@ -157,7 +161,8 @@ switch(params._[0]) {
httpProxy: params.x || null,
debug,
historical,
group: params.g
group: params.g,
append: !!params.A
};
generatePrefixes(inputParameters);

View File

@ -16,7 +16,8 @@ module.exports = function generatePrefixes(inputParameters) {
httpProxy,
debug,
historical,
group
group,
append
} = inputParameters;
const generateList = {};
@ -31,7 +32,7 @@ module.exports = function generatePrefixes(inputParameters) {
if (historical) {
console.log("WARNING: you are using historical visibility data for generating the prefix list.");
}
if (!asnList && !prefixes) {
throw new Error("You need to specify at least an AS number or a list of prefixes.");
}
@ -218,7 +219,7 @@ module.exports = function generatePrefixes(inputParameters) {
}
})
.catch(() => {
console.log("RIPEstat rpki-validation query failed: cannot retrieve information for " + prefix);
console.log("RPKI validation query failed: cannot retrieve information for " + prefix);
});
};
@ -232,6 +233,34 @@ module.exports = function generatePrefixes(inputParameters) {
}
};
const getCurrentPrefixes = (outputFile, yamlContent) => {
const content = fs.readFileSync(outputFile, 'utf8');
const current = yaml.safeLoad(content) || {};
function isObject (item) {
return (item && typeof item === 'object' && !Array.isArray(item));
}
function mergeDeep(target, ...sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, ...sources);
};
return mergeDeep(current, yamlContent);
};
return getBaseRules()
.then(items => [].concat.apply([], items))
.then(prefixes => {
@ -273,8 +302,13 @@ module.exports = function generatePrefixes(inputParameters) {
// Otherwise nothing
})
.then(() => { // write everything into the file
const yamlContent = yaml.dump(generateList);
fs.writeFileSync(outputFile, yamlContent);
if (append) {
const finalList = getCurrentPrefixes(outputFile, generateList);
fs.writeFileSync(outputFile, yaml.dump(finalList));
} else {
fs.writeFileSync(outputFile, yaml.dump(generateList));
}
if (someNotValidatedPrefixes) {
console.log("WARNING: the generated configuration is a snapshot of what is currently announced. Some of the prefixes don't have ROA objects associated or are RPKI invalid. Please, verify the config file by hand!");

View File

@ -206,7 +206,8 @@ export default class Input {
httpProxy: null,
debug: false,
historical: false,
group: null
group: null,
append: false
}
return generatePrefixes(inputParameters);