import bgpq4 from "./bgpq4"; import fs from "node:fs"; import YAML from "yaml"; import axios from "axios"; import { env } from "node:process"; const main = async () => { const config: { "MNT-BY": string[]; "TECH-C": string[]; "ADMIN-C": string[]; "AS-SETS": { [asSetsName: string]: { group: [groupName: string][]; expect: number[]; include: string[]; remarks: string[]; }; }; members: { [member: string]: [groupName: string][]; }[]; } = YAML.parse(fs.readFileSync("../config.yaml", "utf8")); const asSets: { "AS-SET": string; "MNT-BY": string[]; "TECH-C": string[]; "ADMIN-C": string[]; members: number[]; remarks: string[]; include: string[]; }[] = []; console.log("INFO: start AS-SETS generation."); let i = 1; for (let asSetName in config["AS-SETS"]) { console.log( `INFO: generating AS-SETS <${asSetName}>... (${i}/${ Object.keys(config["AS-SETS"]).length })\n` ); let members = await Promise.all( config.members.map(async (member) => { const setName = Object.keys(member)[0]; const setGroup = Object.values(member)[0]; if ( config["AS-SETS"][asSetName].group.filter( (e) => setGroup.includes(e) || (e as any) === "*" ).length == 0 ) return undefined; const answer = await bgpq4(setName); console.log("Add", setName, answer, "to", asSetName); return answer.filter( (as) => !(config["AS-SETS"][asSetName].expect ?? [0]).includes(as) ); }) ); config["AS-SETS"][asSetName].remarks.push( `Generated by git.186526.xyz/186526/net186-as-set.` ); config["AS-SETS"][asSetName].remarks.push( `Updated on ${new Date().toISOString()}.` ); asSets.push({ "AS-SET": asSetName, "MNT-BY": config["MNT-BY"], "TECH-C": config["TECH-C"], "ADMIN-C": config["ADMIN-C"], remarks: config["AS-SETS"][asSetName].remarks, members: Array.from(new Set(members.flat(Infinity))) .filter(Boolean) .sort() as number[], include: (config["AS-SETS"][asSetName].include ?? []).sort(), }); i++; console.log(""); } const answer = asSets.map((k) => { return `as-set: ${k["AS-SET"]} ${k["MNT-BY"].map((k) => `mnt-by: ${k}`).join("\n")} ${k["TECH-C"].map((k) => `tech-c: ${k}`).join("\n")} ${k["ADMIN-C"].map((k) => `admin-c: ${k}`).join("\n")} ${k.remarks.map((k) => `remarks: ${k}`).join("\n")} ${k.members.map((k) => `members: AS${k}`).join("\n")}${k.include.map( (k) => `\nmembers: ${k}` )} source: RIPE\npassword: ${env["RIPE_PASSWORD"]}\n `; }); console.log("INFO: sending update to RIPE Syncupdates..."); const update = await axios.post( "https://syncupdates.db.ripe.net", `DATA=${answer.join("\n")}`, { headers: { "Content-Type": "application/x-www-form-urlencoded", "User-Agent": "net186-as-set/1.0.0 axios curl", }, } ); console.log("INFO: Updates finished.\n"); console.log(update.data); }; main();