add get-exit-nodes script

This commit is contained in:
2025-09-28 10:56:25 -04:00
parent f83ae80b1f
commit 4d6497c196

65
src/get-exit-nodes.js Normal file
View File

@@ -0,0 +1,65 @@
const fs = require('fs');
const path = require('path');
const util = require('util');
const Consensus = require('./tor/Consensus');
const OR = require('./tor/OnionRouter');
const LogLevels = {
off: 0,
error: 1,
warn: 2,
info: 3,
debug: 4
}
let logLevel = LogLevels.error;
function timestamp() {
const d = new Date().toISOString();
return [d.slice(5, 5), d.slice(11, 8)].join(' ')
}
class Logger {
debug(...args) {
if (LogLevels.debug > logLevel) return;
const [format, ...rest] = args;
console.error(timestamp(), "D", util.format(format, ...rest));
}
info(...args) {
if (LogLevels.info > logLevel) return;
const [format, ...rest] = args;
console.error(timestamp(), "I", util.format(format, ...rest));
}
warn(...args) {
if (LogLevels.warn > logLevel) return;
const [format, ...rest] = args;
console.error(timestamp(), "W", util.format(format, ...rest));
}
error(...args) {
if (LogLevels.error > logLevel) return;
const [format, ...rest] = args;
console.error(timestamp(), "E", util.format(format, ...rest));
}
}
(async function main(args) {
try {
const ip_only = args[0] === '--ip-only';
const logger = new Logger();
const home = process.env.HOME || process.env.USERPROFILE;
const app_cache_path = path.join(home, '.cache', 'mini-tor-js');
const cached_consensus_path = path.join(app_cache_path, 'cached-consensus')
fs.mkdirSync(app_cache_path, {recursive: true});
// Load consensus
const consensus = new Consensus(logger);
await consensus.fetch(cached_consensus_path);
consensus.set_allowed_dir_ports(80, 443);
const routers = consensus.get_onion_routers_by_criteria({
flags: OR.valid | OR.exit
});
for (const router of routers) {
if (ip_only) console.log(router.ip);
else console.log(router.name, router.ip, router.dir_port, router.or_port);
}
} catch (error) {
console.error(error);
}
})(process.argv.slice(2))