Allows signals to be sent to Tor instances using the control protocol from the rpc interface

This commit is contained in:
Zachary Boyd 2018-05-10 22:41:15 -07:00
parent 48373e3c71
commit 1273316e7d
3 changed files with 74 additions and 16 deletions

View file

@ -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));

View file

@ -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;

View file

@ -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)),