diff --git a/src/ControlServer.js b/src/ControlServer.js index ac8dc18..65acb22 100644 --- a/src/ControlServer.js +++ b/src/ControlServer.js @@ -169,6 +169,7 @@ class ControlServer { return new Promise((resolve, reject) => { this.torPool.set_config_by_name(name, keyword, value, (error) => { if (error) reject(error); + else resolve(); }); }); }).bind(this)); @@ -177,6 +178,35 @@ class ControlServer { return new Promise((resolve, reject) => { this.torPool.set_config_at(index, keyword, value, (error) => { if (error) reject(error); + else resolve(); + }); + }); + }).bind(this)); + + + server.expose('signalAllInstances', (function (signal) { + return new Promise((resolve, reject) => { + this.torPool.signal_all(signal, (error) => { + if (error) reject(error); + else resolve(); + }); + }); + }).bind(this)); + + server.expose('signalInstanceAt', (function (index, signal, callback) { + return new Promise((resolve, reject) => { + this.torPool.signal_at(index, signal, (error) => { + if (error) reject(error); + else resolve(); + }); + }); + }).bind(this)); + + server.expose('signalInstanceByName', (function (name, signal, callback) { + return new Promise((resolve, reject) => { + this.torPool.signal_by_name(name, signal, (error) => { + if (error) reject(error); + else resolve(); }); }); }).bind(this)); diff --git a/src/TorPool.js b/src/TorPool.js index 1d5a3ea..26a14f9 100644 --- a/src/TorPool.js +++ b/src/TorPool.js @@ -160,7 +160,7 @@ class TorPool extends EventEmitter { new_ip_at(index, callback) { this.logger && this.logger.warn(`TorPool.new_ip_at is deprecated, use TorPool.new_identity_at`); - return this.new_identity_at(inde, callback); + return this.new_identity_at(index, callback); } /* End Deprecated */ @@ -188,6 +188,24 @@ class TorPool extends EventEmitter { if (!instance) return callback && callback(new Error(`Instance at ${index} not found`)); instance.set_config(keyword, value, callback); } + + signal_all(signal, callback) { + async.each(this.instances, (instance, next) => { + instance.signal(signal, callback); + }, callback); + } + + signal_by_name(name, signal, callback) { + let instance = this.instance_by_name(name); + if (!instance) return callback && callback(new Error(`Instance "${name}" not found`)); + instance.signal(signal, callback); + } + + signal_at(index, signal, callback) { + let instance = this.instances[index]; + if (!instance) return callback && callback(new Error(`Instance at ${index} not found`)); + instance.signal(signal, callback); + } }; TorPool.LoadBalanceMethods = load_balance_methods; diff --git a/src/TorProcess.js b/src/TorProcess.js index 27d9cf9..2f82588 100644 --- a/src/TorProcess.js +++ b/src/TorProcess.js @@ -34,19 +34,6 @@ class TorProcess extends EventEmitter { this.process.kill('SIGINT'); } - /* Begin Deprecated */ - - new_ip(callback) { - this.logger && this.logger.warn(`TorProcess.new_ip is deprecated, use TorProcess.new_identity`); - return this.new_identity(callback); - } - - /* End Deprecated */ - - new_identity(callback) { - this.logger.info(`[tor-${this.instance_name}]: requested a new identity`); - this.controller.cleanCircuits(callback || (() => {})); - } get instance_name() { return (this.definition && this.definition.Name) || this.process.pid; @@ -69,12 +56,18 @@ class TorProcess extends EventEmitter { } /* Passthrough to granax */ + + new_identity(callback) { + this.logger.info(`[tor-${this.instance_name}]: requested a new identity`); + this.controller.cleanCircuits(callback || (() => {})); + } + get_config(keyword, callback) { if (!this.controller) { return callback(new Error(`Controller is not connected`)); } - this.controller.getConfig(keyword, callback); + return this.controller.getConfig(keyword, callback); } set_config(keyword, value, callback) { @@ -82,9 +75,26 @@ class TorProcess extends EventEmitter { return callback(new Error(`Controller is not connected`)); } - this.controller.setConfig(keyword, value, callback); + return this.controller.setConfig(keyword, value, callback); } + signal(signal, callback) { + if (!this.controller) { + return callback(new Error(`Controller is not connected`)); + } + + return this.controller.signal(signal, callback); + } + + /* Begin Deprecated */ + + new_ip(callback) { + this.logger && this.logger.warn(`TorProcess.new_ip is deprecated, use TorProcess.new_identity`); + return this.new_identity(callback); + } + + /* End Deprecated */ + create(callback) { async.auto({ dnsPort: (callback) => getPort().then(port => callback(null, port)),