Uses JSON-RPC 2 for the control server. Removes socket.io
This commit is contained in:
parent
e4f081304e
commit
f8698b1541
27
README.md
27
README.md
|
@ -36,18 +36,31 @@ For example: `tor-router -j 3 -s 9050` would start the proxy with 3 tor instance
|
|||
|
||||
## Control Server
|
||||
|
||||
A socket.io server included will listen on port 9077 by default. Using the socket.io server the client can add/remove Tor instances and get a new identity (which includes a new ip address) while Tor Router is running.
|
||||
A JSON-RPC 2 TCP Server will listen on port 9077 by default. Using the rpc server the client can add/remove Tor instances and get a new identity (which includes a new ip address) while Tor Router is running.
|
||||
|
||||
Example (in node):
|
||||
|
||||
```
|
||||
var client = require('socket.io-client').connect('ws://localhost:9077');
|
||||
client.emit('createInstances', 3, (error) => {
|
||||
if (error) return;
|
||||
console.log('three instances created!');
|
||||
client.emit('newIps');
|
||||
console.log('clients have new ips!')
|
||||
var net = require('net');
|
||||
|
||||
const client = net.createConnection({ port: 9077 }, () => {
|
||||
var rpcRequest = {
|
||||
"method": "createInstances",
|
||||
"params": [3],
|
||||
"jsonrpc":"2.0",
|
||||
"id": 1
|
||||
};
|
||||
client.write(JSON.stringify(rpcRequest));
|
||||
});
|
||||
|
||||
client.on('data', (chunk) => {
|
||||
var rawResponse = chunk.toString('utf8');
|
||||
var rpcResponse = JSON.parse(rawResponse);
|
||||
console.log(rpcResponse)
|
||||
if (rpcResponse.id === 1) {
|
||||
console.log('Three instances have been created!')
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## Test
|
||||
|
|
|
@ -61,6 +61,6 @@ if (instances) {
|
|||
});
|
||||
}
|
||||
|
||||
control.server.listen(control_port, () => {
|
||||
control.listen(control_port, () => {
|
||||
logger && logger.info(`[control]: Control Server listening on ${control_port}`);
|
||||
})
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "tor-router",
|
||||
"version": "3.1.0",
|
||||
"version": "3.2.0",
|
||||
"main": "src/index.js",
|
||||
"repository": "git@github.com:znetstar/tor-router.git",
|
||||
"author": "Zachary Boyd <zachary@zacharyboyd.nyc>",
|
||||
|
@ -24,9 +24,9 @@
|
|||
"commander": "^2.9.0",
|
||||
"eventemitter2": "^3.0.0",
|
||||
"get-port": "^2.1.0",
|
||||
"jrpc2": "^1.0.5",
|
||||
"lodash": "^4.17.4",
|
||||
"native-dns": "git+https://github.com/znetstar/node-dns.git",
|
||||
"socket.io": "^1.7.3",
|
||||
"socks-proxy-agent": "^3.0.1",
|
||||
"socksv5": "git+https://github.com/lee-elenbaas/socksv5.git",
|
||||
"temp": "^0.8.3",
|
||||
|
|
|
@ -1,70 +1,102 @@
|
|||
const HTTPServer = require('http').Server;
|
||||
const TorPool = require('./TorPool');
|
||||
const SOCKSServer = require('./SOCKSServer');
|
||||
const DNSServer = require('./DNSServer');
|
||||
const HTTPProxyServer = require('./HTTPServer');
|
||||
const HTTPServer = require('./HTTPServer');
|
||||
const rpc = require('jrpc2');
|
||||
|
||||
class ControlServer {
|
||||
constructor(logger) {
|
||||
this.server = new HTTPServer();
|
||||
this.io = require('socket.io')(this.server);
|
||||
|
||||
this.torPool = new TorPool(null, null, logger);
|
||||
var torPool = this.torPool = new TorPool(null, null, logger);
|
||||
this.logger = logger;
|
||||
|
||||
this.io.use(this.handleConnection.bind(this));
|
||||
}
|
||||
let server = this.server = new rpc.Server();
|
||||
server.expose('createTorPool', this.createTorPool.bind(this));
|
||||
server.expose('createSOCKSServer', this.createSOCKSServer.bind(this));
|
||||
server.expose('createDNSServer', this.createDNSServer.bind(this));
|
||||
server.expose('createHTTPServer', this.createHTTPServer.bind(this));
|
||||
|
||||
listen() { this.server.listen.apply(this.server, arguments); }
|
||||
close() { this.server.close.apply(this.server, arguments); }
|
||||
server.expose('queryInstances', function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!torPool)
|
||||
return reject({ message: 'No pool created' });
|
||||
|
||||
handleConnection(socket, next) {
|
||||
socket.on('createTorPool', this.createTorPool.bind(this));
|
||||
socket.on('createSOCKSServer', this.createSOCKSServer.bind(this));
|
||||
socket.on('createDNSServer', this.createDNSServer.bind(this));
|
||||
socket.on('createHTTPServer', this.createHTTPServer.bind(this));
|
||||
socket.on('queryInstances', (callback) => {
|
||||
if (!this.torPool)
|
||||
return callback({ message: 'No pool created' });
|
||||
|
||||
callback(null, this.torPool.instances.map((i) => ( { dns_port: i.dns_port, socks_port: i.socks_port, process_id: i.process.pid } )) );
|
||||
resolve(torPool.instances.map((i) => ( { dns_port: i.dns_port, socks_port: i.socks_port, process_id: i.process.pid } )) );
|
||||
});
|
||||
});
|
||||
|
||||
socket.on('createInstances', (instances, callback) => { this.torPool.create(instances, (error, instances) => {
|
||||
callback && callback(error)
|
||||
}); });
|
||||
socket.on('removeInstances', (instances, callback) => { this.torPool.remove(instances, callback); });
|
||||
socket.on('newIps', () => { this.torPool.new_ips(); });
|
||||
socket.on('nextInstance', () => { this.torPool.next(); });
|
||||
socket.on('closeInstances', () => { this.torPool.exit(); });
|
||||
server.expose('createInstances', function (instances) {
|
||||
return new Promise((resolve, reject) => {
|
||||
torPool.create(instances, (error, instances) => {
|
||||
if (error) reject(error);
|
||||
else resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
next();
|
||||
server.expose('removeInstances', function (instances) {
|
||||
return new Promise((resolve, reject) => {
|
||||
torPool.remove(instances, (error) => {
|
||||
if (error) reject(error);
|
||||
else resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
server.expose('newIps', function () {
|
||||
torPool.new_ips();
|
||||
return Promise.resolve();
|
||||
});
|
||||
|
||||
server.expose('nextInstance', function () {
|
||||
torPool.next();
|
||||
return Promise.resolve();
|
||||
});
|
||||
|
||||
server.expose('closeInstances', function () {
|
||||
torPool.exit();
|
||||
return Promise.resolve();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
listen(port, callback) {
|
||||
this.tcpTransport = new rpc.tcpTransport({ port });
|
||||
this.tcpTransport.listen(this.server);
|
||||
callback();
|
||||
}
|
||||
|
||||
close() {
|
||||
return this.tcpTransport.tcpServer.close();
|
||||
}
|
||||
|
||||
createTorPool(options) {
|
||||
this.torPool = new TorPool(null, options, this.logger);
|
||||
return this.torPool;
|
||||
this.torPool;
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
createSOCKSServer(port) {
|
||||
this.socksServer = new SOCKSServer(this.torPool, this.logger);
|
||||
this.socksServer.listen(port || 9050);
|
||||
this.logger && this.logger.info(`[socks]: Listening on ${port}`);
|
||||
return this.socksServer;
|
||||
this.socksServer;
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
createHTTPServer(port) {
|
||||
this.httpServer = new HTTPProxyServer(this.torPool, this.logger);
|
||||
this.httpServer.listen(port || 9080);
|
||||
this.logger && this.logger.info(`[http]: Listening on ${port}`);
|
||||
return this.httpServer;
|
||||
this.httpServer;
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
createDNSServer(port) {
|
||||
this.dnsServer = new DNSServer(this.torPool, this.logger);
|
||||
this.dnsServer.serve(port || 9053);
|
||||
this.logger && this.logger.info(`[dns]: Listening on ${port}`);
|
||||
return this.dnsServer;
|
||||
this.dnsServer;
|
||||
return Promise.resolve();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue