forked from rgbkrk/pipboyrelay
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcli.js
120 lines (98 loc) · 3.17 KB
/
cli.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env node
var pipboylib = require('pipboylib');
var relay = require('./relay');
var hexy = require('hexy');
var util = require('util');
var UDPRelay = relay.UDPRelay;
var TCPRelay = relay.TCPRelay;
var program = require('commander');
var version = require('./package.json').version;
program
.version(version)
.option('-t --output-type <type>', 'Output type', /^(hex|decoded)$/i, 'hex')
.option('-m --metadata', 'Metadata about telemetry')
program.on('--help', function (){
console.log(' Examples:');
console.log('');
console.log(' $ pipboyrelay -t hex');
console.log(' $ pipboyrelay -t decoded');
console.log('');
});
program.parse(process.argv)
var maxShowLength = 48;
pipboylib.connection.discover().then(function (server) {
// Set up a new relay for each running server
var udpRelay = new UDPRelay();
udpRelay.bind(server.info, function (data, telemetry) {
if (program.metdata) {
var t = util.format('%s:%d -> %s:%d',
telemetry.src.address, telemetry.src.port,
telemetry.dst.address, telemetry.dst.port);
console.error('[UDP Relay] ', t);
}
if (program.outputType == 'hex') {
var dataChunk = data.slice(0, Math.min(data.length, maxShowLength));
var dots = '';
if (dataChunk.length < data.length) {
dots = '...';
}
console.log(hexy.hexy(dataChunk) + dots);
} else {
console.log(JSON.parse(data));
}
});
var tcpServerInfo = {};
tcpServerInfo.address = server.info.address;
tcpServerInfo.port = pipboylib.constants.FALLOUT_TCP_PORT;
tcpServerInfo.family = server.info.family;
var clientParser, serverParser;
if (program.outputType == 'decoded') {
var clientParser = pipboylib.decoding.createDataStream()
var serverParser = pipboylib.decoding.createDataStream()
serverParser.on("readable", function() {
var e;
while (e = this.read()) {
console.log(e);
}
});
clientParser.on("readable", function() {
var e;
while (e = this.read()) {
console.log(e);
}
});
}
var tcpRelay = new TCPRelay();
tcpRelay.listen(tcpServerInfo, function (data, telemetry) {
if (program.metdata) {
var t = util.format('%s:%d -> %s:%d',
telemetry.src.address, telemetry.src.port,
telemetry.dst.address, telemetry.dst.port);
console.error('[TCP Relay] ', t);
}
var fromServer = telemetry.src.port === tcpServerInfo.port &&
telemetry.src.address === tcpServerInfo.address;
if (program.outputType == 'hex') {
var dataChunk = data.slice(0, Math.min(data.length, maxShowLength));
var dots = '';
if (dataChunk.length < data.length) {
dots = '...';
}
console.log(hexy.hexy(dataChunk) + dots);
} else {
var parser;
if (fromServer) {
parser = serverParser;
} else {
parser = clientParser;
}
parser.write(data);
}
});
if (program.metadata) {
console.error('UDP and TCP Relay created for:',
server.MachineType, 'on', server.info.address)
}
}).catch(function(err) {
throw err;
});