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

refactoring, operations on yml file are delegated to inputYml

This commit is contained in:
Massimo Candela
2020-08-04 20:35:21 +02:00
parent 794de989b8
commit 709765aa44
4 changed files with 56 additions and 37 deletions

View File

@@ -31,6 +31,8 @@
*/
import yargs from 'yargs';
import fs from "fs";
import yaml from "js-yaml";
const params = yargs
.usage('Usage: $0 <command> [options]')
@@ -163,10 +165,22 @@ switch(params._[0]) {
historical,
group: params.g,
append: !!params.A,
logger: null
logger: null,
getCurrentPrefixesList: () => {
const content = JSON.parse( yaml.safeLoad(fs.readFileSync(params.o, "utf8")) || {});
return Promise.resolve(content);
}
};
generatePrefixes(inputParameters);
if (!inputParameters.outputFile) {
throw new Error("Output file not specified");
}
generatePrefixes(inputParameters)
.then(content => {
fs.writeFileSync(params.o, yaml.dump(content));
process.exit(0);
});
break;

View File

@@ -1,10 +1,8 @@
import axios from "axios";
import url from "url";
import brembo from "brembo";
import yaml from "js-yaml";
import batchPromises from "batch-promises";
import RpkiValidator from "rpki-validator";
import fs from "fs";
import { AS } from "./model";
const apiTimeout = 120000;
const clientId = "ntt-bgpalerter"
@@ -13,7 +11,6 @@ const rpki = new RpkiValidator({clientId});
module.exports = function generatePrefixes(inputParameters) {
let {
asnList,
outputFile,
exclude,
excludeDelegated,
prefixes,
@@ -23,7 +20,8 @@ module.exports = function generatePrefixes(inputParameters) {
historical,
group,
append,
logger
logger,
getCurrentPrefixesList
} = inputParameters;
logger = logger || console.log;
@@ -49,10 +47,6 @@ module.exports = function generatePrefixes(inputParameters) {
throw new Error("You can specify an AS number or a list of prefixes, not both.");
}
if (!outputFile) {
throw new Error("Output file not specified");
}
if (asnList && asnList.length) {
asnList = asnList.map(i => i.replace("AS", ""));
if (asnList.some(i => !new AS([i]).isValid())) {
@@ -261,9 +255,7 @@ module.exports = function generatePrefixes(inputParameters) {
}
};
const getCurrentPrefixes = (outputFile, yamlContent) => {
const content = fs.readFileSync(outputFile, 'utf8');
const current = yaml.safeLoad(content) || {};
const mergeCurrentPrefixes = (current, yamlContent) => {
function isObject (item) {
return (item && typeof item === 'object' && !Array.isArray(item));
@@ -338,13 +330,17 @@ module.exports = function generatePrefixes(inputParameters) {
logger("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!");
}
})
.then(() => { // write everything into the file
const list = (append) ? getCurrentPrefixes(outputFile, generateList) : generateList;
fs.writeFileSync(outputFile, yaml.dump(list));
.then(() => {
return (append)
? getCurrentPrefixesList()
.then(current => {
return mergeCurrentPrefixes(current, generateList)
})
: generateList;
})
.then(list => {
logger("Done!");
return list;
})
.catch((e) => {
logger(`Something went wrong ${e}`);

View File

@@ -158,10 +158,14 @@ export default class Input {
throw new Error('The method loadPrefixes MUST be implemented');
};
save = () => {
save = (data) => {
throw new Error('The method save MUST be implemented');
};
retrieve = () => {
throw new Error('The method retrieve MUST be implemented');
};
generate = () => {
return inquirer
.prompt([
@@ -202,12 +206,10 @@ export default class Input {
}
])
.then((answer) => {
// const generatePrefixes = require("../generatePrefixesList");
const asns = answer.asns.split(",");
const inputParameters = {
asnList: asns,
outputFile: this.config.volume + "prefixes.yml",
exclude: [],
excludeDelegated: answer.i,
prefixes: null,
@@ -217,19 +219,16 @@ export default class Input {
historical: false,
group: null,
append: false,
logger: null
logger: null,
getCurrentPrefixesList: () => {
return this.retrieve();
}
};
if (this.config.generatePrefixListEveryDays >= 1 && this.storage) {
return this.storage
.set(this.prefixListStorageKey, inputParameters)
.then(() => generatePrefixes(inputParameters))
.catch(error => {
this.logger.log({
level: 'error',
message: error
});
});
.then(() => generatePrefixes(inputParameters));
} else {
return generatePrefixes(inputParameters);
}
@@ -238,9 +237,14 @@ export default class Input {
} else {
throw new Error("Nothing to monitor.");
}
})
.then(this.save)
.catch(error => {
this.logger.log({
level: 'error',
message: error
});
});
};
_reGeneratePrefixList = () => {
@@ -269,7 +273,7 @@ export default class Input {
.then(() => {
this.logger.log({
level: 'info',
message: "Prefix list updated. See prefixes.yml."
message: `Prefix list updated.`
});
this.setReGeneratePrefixList();
})

View File

@@ -49,7 +49,8 @@ export default class InputYml extends Input {
};
loadPrefixes = () => {
if (!fs.existsSync(this.config.volume + this.config.monitoredPrefixesFiles[0])) {
this.defaultPrefixFile = this.config.volume + this.config.monitoredPrefixesFiles[0];
if (!fs.existsSync(this.defaultPrefixFile)) {
return this.generate()
.then(() => this._loadPrefixes());
}
@@ -269,7 +270,12 @@ export default class InputYml extends Input {
return this.asns;
};
save = () =>
save = (content) => {
fs.writeFileSync(this.defaultPrefixFile, yaml.dump(content));
return Promise.resolve();
};
retrieve = () =>
new Promise((resolve, reject) => {
const prefixes = {};
for (let rule of this.prefixes) {
@@ -299,7 +305,6 @@ export default class InputYml extends Input {
};
}
fs.writeFileSync("prefixes.yml", yaml.dump({ ...prefixes, ...options }));
resolve(true)
resolve({ ...prefixes, ...options });
});
}