diff --git a/exec/binkit.js b/exec/binkit.js index 50a002694f1baefdd10a8478fb2f0a6234199d1d..0e6150d9a25ac5adde46ccf36467205a93a72f7b 100644 --- a/exec/binkit.js +++ b/exec/binkit.js @@ -116,7 +116,7 @@ function outbound_root(addr, scfg, ftnd) function add_outbound_files(addrs, bp) { function has_lock(addr) { - var bsy = outbound_root(addr, bp.cb_data.binkit_scfg, bp.cb_data.binkit_ftnd)+addr.flo_outbound(bp.default_zone, bp.default_domain)+'bsy'; + var bsy = outbound_root(addr, bp.cb_data.binkit_scfg, FIDO.FTNDomains)+addr.flo_outbound(bp.default_zone, bp.default_domain)+'bsy'; var i; for (i=0; i<bp.cb_data.binkit_locks.length; i++) { @@ -131,11 +131,11 @@ function add_outbound_files(addrs, bp) log(LOG_DEBUG, "Adding outbound files for "+addr); // Find all possible flow files for the remote. - var allfiles = directory(outbound_root(addr, bp.cb_data.binkit_scfg, bp.cb_data.binkit_ftnd)+addr.flo_outbound(bp.default_zone, bp.default_domain)+'*'); + var allfiles = directory(outbound_root(addr, bp.cb_data.binkit_scfg, FIDO.FTNDomains)+addr.flo_outbound(bp.default_zone, bp.default_domain)+'*'); // Parse flow files and call addFile() tracking what to do on success. if (allfiles.length > 0) { if (!has_lock(addr)) { - lock_files = lock_flow(outbound_root(addr, bp.cb_data.binkit_scfg, bp.cb_data.binkit_ftnd)+addr.flo_outbound(bp.default_zone, bp.default_domain)); + lock_files = lock_flow(outbound_root(addr, bp.cb_data.binkit_scfg, FIDO.FTNDomains)+addr.flo_outbound(bp.default_zone, bp.default_domain)); if (lock_files === undefined) return; bp.cb_data.binkit_locks.push(lock_files); @@ -501,7 +501,6 @@ function callout(addr, scfg, ftnd, semaphores, locks, bicfg) binkitcfg:bicfg, binkit_to_addr:addr, binkit_scfg:scfg, - binkit_ftnd:ftnd, binkit_file_actions:{}, binkit_flow_contents:{}, binkit_create_semaphores:semaphores, @@ -714,15 +713,14 @@ function run_outbound(ran) log(LOG_INFO, "Running outbound"); scfg = new SBBSEchoCfg(); - ftnd = new FTNDomains(); if (!scfg.is_flo) { log(LOG_ERROR, "sbbsecho not configured for FLO-style mailers."); return false; } outbound_roots.push(scfg.outbound.replace(/[\\\/]$/, '')); - Object.keys(ftnd.outboundMap).forEach(function(key) { - outbound_roots.push(ftnd.outboundMap[key]); + Object.keys(FIDO.FTNDomains.outboundMap).forEach(function(key) { + outbound_roots.push(FIDO.FTNDomains.outboundMap[key]); }); outbound_roots.forEach(function(oroot) { var dirs; @@ -760,7 +758,7 @@ function run_outbound(ran) }); }); outbound_dirs.forEach(function(dir) { - run_one_outbound_dir(dir, scfg, ftnd, semaphores, ran); + run_one_outbound_dir(dir, scfg, FIDO.FTNDomains, semaphores, ran); }); semaphores.forEach(function(semname) { @@ -846,7 +844,6 @@ function run_inbound(sock) bp.cb_data = { binkitcfg:new BinkITCfg(), binkit_scfg:new SBBSEchoCfg(), - binkit_ftnd:new FTNDomains(), binkit_file_actions:{}, binkit_flow_contents:{}, binkit_create_semaphores:semaphores, diff --git a/exec/load/binkp.js b/exec/load/binkp.js index 235388605c40b431a3d5f78696eaed0f95cd91df..833eb0477e15a1eae6b229bf6027bbb2cd1db21b 100644 --- a/exec/load/binkp.js +++ b/exec/load/binkp.js @@ -384,7 +384,7 @@ BinkP.prototype.connect = function(addr, password, auth_cb, port, inet_host) if (password === '-') this.require_md5 = false; if (port === undefined) - port = 24554; + port = addr.binkp_port; if (inet_host === undefined) inet_host = addr.inet_host; diff --git a/exec/load/fido.js b/exec/load/fido.js index aa744072a205f0b369338e1f2426c440b6ef8cd2..8a8b2626fc432cee3dca915ec4b94ad999603166 100644 --- a/exec/load/fido.js +++ b/exec/load/fido.js @@ -13,7 +13,8 @@ require('fido_syscfg.js', 'FTNDomains'); * These are type and value checked when assigned and throw an * exception when illegal. * - * inet_host - Internet hostname at the binkp.net domain + * inet_host - Internet hostname at the binkp.net domain or listed + * in nodelist. * str - Address as a string in the most possible dimensions * toString() - Overrides the default... same as str * flo_outbound(default_zone, default_domain) @@ -30,9 +31,10 @@ require('fido_syscfg.js', 'FTNDomains'); * FIDO.parse_flo_file_path(path, default_zone, domain) * Parses a flo filename and path into the returned FIDO.Addr object. * - * FIDO.parse_nodelist(path, warn) + * FIDO.parse_nodelist(path, warn[, domain]) * Parses a nodelist and returns an object with an entries object in - * it containing all the nodelist entries (3D address is the key). + * it containing all the nodelist entries (4D address is the key + * unless domain is specified in which case 5D address is the key). * If warn is true, will warn on "illegal" values (per FTS-0005). */ @@ -209,13 +211,15 @@ var FIDO = { this.hub = hub.str; this.private = this.hold = this.down = false; }, - parse_nodelist:function(filename, warn) + parse_nodelist:function(filename, warn, domain) { var f = new File(filename); var ret = {}; if (warn === undefined) warn = false; + if (domain === undefined) + domain = ''; if (!f.open("r")) throw("Unable to open '"+f.name+"'."); @@ -248,6 +252,7 @@ var FIDO = { var flags; var flag; var value; + node.domain = domain; ret.entries = {}; while ((line = f.readln(2048))) { @@ -448,12 +453,41 @@ Object.defineProperties(FIDO.Addr.prototype, { if (this.zone === undefined) throw('zone is undefined'); + // TODO: These don't need to be loaded into different objects since we're doing 5D + if (FIDO.FTNDomains.nodeListFN[this.domain] !== undefined && file_exists(FIDO.FTNDomains.nodeListFN[this.domain])) { + if (FIDO.FTNDomains.nodeList[this.domain] === undefined) + FIDO.FTNDomains.nodeList[this.domain] = FIDO.parse_nodelist(FIDO.FTNDomains.nodeListFN[this.domain], false, this.domain); + if (FIDO.FTNDomains.nodeList[this.str] !== undefined) { + // TODO: Maybe support non-IBN stuff as well... + ret = FIDO.FTNDomains.nodeList[this.str].binkp_host; + if (ret !== undefined) + return ret; + } + } + if (this.point !== undefined) ret += format("p%d", this.point); ret += format("f%d.n%d.z%d.%s", this.node, this.net, this.zone, FIDO.FTNDomains.domainDNSMap[this.domain] === undefined ? '.example.com' : FIDO.FTNDomains.domainDNSMap[this.domain]); return ret; } - } + }, + 'binkp_port': { + get: function() { + // TODO: Use default zone from system.fido_addr_list[0]? + if (this.zone === undefined) + throw('zone is undefined'); + + // TODO: These don't need to be loaded into different objects since we're doing 5D + if (FIDO.FTNDomains.nodeListFN[this.domain] !== undefined && file_exists(FIDO.FTNDomains.nodeListFN[this.domain])) { + if (FIDO.FTNDomains.nodeList[this.domain] === undefined) + FIDO.FTNDomains.nodeList[this.domain] = FIDO.parse_nodelist(FIDO.FTNDomains.nodeListFN[this.domain], false, this.domain); + if (FIDO.FTNDomains.nodeList[this.str] !== undefined) + return FIDO.FTNDomains.nodeList[this.str].binkp_port; + } + + return 24554; + } + }, }); FIDO.Packet.type = { TWO:0, // FTS-0001 @@ -503,7 +537,7 @@ Object.defineProperties(FIDO.Node.prototype, { if (this.flags.IBN.search(/^[0-9]+$/) == -1) { if (this.flags.IBN.indexOf(':' !== -1)) return this.flags.IBN.replace(/:.*$/,''); - return this.flags.IBN; + return this.flags.IBN.replace(/\.$/,''); } } for (i in iflags) { @@ -515,7 +549,7 @@ Object.defineProperties(FIDO.Node.prototype, { continue; if (this.flags[iflags[i]].indexOf(':') !== -1) return this.flags[iflags[i]].replace(/:.*$/,''); - return this.flags[iflags[i]]; + return this.flags[iflags[i]].replace(/\.$/,''); } if (this.name.indexOf('.') !== -1) return this.name.replace(/ /, '_'); diff --git a/exec/load/fido_syscfg.js b/exec/load/fido_syscfg.js index 0c3001691f31843a626f71eb2e947edda397c353..c76bceeef5aceeb2efcbb5985922216892eaeab1 100644 --- a/exec/load/fido_syscfg.js +++ b/exec/load/fido_syscfg.js @@ -115,6 +115,8 @@ function FTNDomains() this.domainMap = {}; this.domainDNSMap = {}; this.outboundMap = {}; + this.nodeListFN = {}; + this.nodeList = {}; var domains = f.iniGetSections().forEach(function(domain) { var d = domain.toLowerCase().substr(0,8); var zones = f.iniGetValue(domain, 'Zones', ''); @@ -134,6 +136,7 @@ function FTNDomains() }, this); } this.domainDNSMap[d] = f.iniGetValue(domain, 'DNSSuffix', 'example.com'); + this.nodeListFN[d] = f.iniGetValue(domain, 'NodeList', undefined); this.outboundMap[d] = f.iniGetValue(domain, 'OutboundRoot', ecfg.outbound.replace(/[\\\/]$/, '')).replace(/[\\\/]$/, ''); }, this); f.close();