From 5534ba2ef1de2b7ce355e07a11c907a4933235e9 Mon Sep 17 00:00:00 2001 From: tigerbot Date: Thu, 26 Oct 2017 16:27:10 -0600 Subject: [PATCH] moved the handling of udp stuff to a separate file --- lib/goldilocks.js | 27 ---------------------- lib/udp.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++ lib/worker.js | 1 + 3 files changed, 58 insertions(+), 27 deletions(-) create mode 100644 lib/udp.js diff --git a/lib/goldilocks.js b/lib/goldilocks.js index b3226e1..ee54887 100644 --- a/lib/goldilocks.js +++ b/lib/goldilocks.js @@ -159,27 +159,6 @@ module.exports.create = function (deps, config) { }); } - function udpHandler(port, msg) { - if (!Array.isArray(config.udp.modules)) { - return; - } - var socket = require('dgram').createSocket('udp4'); - config.udp.modules.forEach(function (mod) { - if (mod.type !== 'forward') { - console.warn('found bad DNS module', mod); - return; - } - if (mod.ports.indexOf(port) < 0) { - return; - } - - var dest = require('./domain-utils').separatePort(mod.address || ''); - dest.port = dest.port || mod.port; - dest.host = dest.host || mod.host || 'localhost'; - socket.send(msg, dest.port, dest.host); - }); - } - function createTcpForwarder(mod) { var dest = require('./domain-utils').separatePort(mod.address || ''); dest.port = dest.port || mod.port; @@ -289,12 +268,6 @@ module.exports.create = function (deps, config) { listenPromises.push(listeners.tcp.add(port, tcpHandler)); }); - if (config.udp.bind) { - config.udp.bind.forEach(function (port) { - listenPromises.push(listeners.udp.add(port, udpHandler.bind(port))); - }); - } - if (!config.mdns.disabled) { require('./mdns').start(deps, config, portList[0]); } diff --git a/lib/udp.js b/lib/udp.js new file mode 100644 index 0000000..8d50267 --- /dev/null +++ b/lib/udp.js @@ -0,0 +1,57 @@ +'use strict'; + +module.exports.create = function (deps, config) { + var listeners = require('./servers').listeners.udp; + + function packetHandler(port, msg) { + if (!Array.isArray(config.udp.modules)) { + return; + } + + var socket = require('dgram').createSocket('udp4'); + config.udp.modules.forEach(function (mod) { + if (mod.type !== 'forward') { + // To avoid logging bad modules every time we get a UDP packet we assign a warned + // property to the module (non-enumerable so it won't be saved to the config or + // show up in the API). + if (!mod.warned) { + console.warn('found bad DNS module', mod); + Object.defineProperty(mod, 'warned', {value: true, enumerable: false}); + } + return; + } + if (mod.ports.indexOf(port) < 0) { + return; + } + + var dest = require('./domain-utils').separatePort(mod.address || ''); + dest.port = dest.port || mod.port; + dest.host = dest.host || mod.host || 'localhost'; + socket.send(msg, dest.port, dest.host); + }); + } + + function updateListeners() { + var current = listeners.list(); + var wanted = config.udp.bind; + + if (!Array.isArray(wanted)) { wanted = []; } + wanted = wanted.map(Number).filter((port) => port > 0 && port < 65356); + + current.forEach(function (port) { + if (wanted.indexOf(port) < 0) { + listeners.close(port); + } + }); + wanted.forEach(function (port) { + if (current.indexOf(port) < 0) { + listeners.add(port, packetHandler.bind(port)); + } + }); + } + + updateListeners(); + return { + updateConf: updateListeners + }; +}; diff --git a/lib/worker.js b/lib/worker.js index 665c48e..435c066 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -51,6 +51,7 @@ function create(conf) { , proxy: require('./proxy-conn').create(deps, conf) , socks5: require('./socks5-server').create(deps, conf) , ddns: require('./ddns').create(deps, conf) + , udp: require('./udp').create(deps, conf) }; Object.assign(deps, modules);