-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathmain.js
129 lines (112 loc) · 4.87 KB
/
main.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
121
122
123
124
125
126
127
128
129
const tcpProxy = require('node-tcp-proxy');
const onvifServer = require('./src/onvif-server');
const configBuilder = require('./src/config-builder');
const package = require('./package.json');
const argparse = require('argparse');
const readline = require('readline');
const stream = require('stream');
const yaml = require('yaml');
const fs = require('fs');
const simpleLogger = require('simple-node-logger');
const parser = new argparse.ArgumentParser({
description: 'Virtual Onvif Server'
});
parser.add_argument('-v', '--version', { action: 'store_true', help: 'show the version information' });
parser.add_argument('-cc', '--create-config', { action: 'store_true', help: 'create a new config' });
parser.add_argument('-d', '--debug', { action: 'store_true', help: 'show onvif requests' });
parser.add_argument('config', { help: 'config filename to use', nargs: '?'});
let args = parser.parse_args();
if (args) {
const logger = simpleLogger.createSimpleLogger();
if (args.debug)
logger.setLevel('trace');
if (args.version) {
logger.info('Version: ' + package.version);
return;
}
if (args.create_config) {
let mutableStdout = new stream.Writable({
write: function(chunk, encoding, callback) {
if (!this.muted || chunk.toString().includes('\n'))
process.stdout.write(chunk, encoding);
callback();
}
});
const rl = readline.createInterface({
input: process.stdin,
output: mutableStdout,
terminal: true
});
mutableStdout.muted = false;
rl.question('Onvif Server: ', (hostname) => {
rl.question('Onvif Username: ', (username) => {
mutableStdout.muted = true;
process.stdout.write('Onvif Password: ');
rl.question('', (password) => {
console.log('Generating config ...');
configBuilder.createConfig(hostname, username, password).then((config) => {
if (config) {
console.log('# ==================== CONFIG START ====================');
console.log(yaml.stringify(config));
console.log('# ===================== CONFIG END =====================');
} else
console.log('Failed to create config!');
});
rl.close();
});
});
});
} else if (args.config) {
let configData;
try {
configData = fs.readFileSync(args.config, 'utf8');
} catch (error) {
if (error.code === 'ENOENT') {
logger.error('File not found: ' + args.config);
return -1;
}
throw error;
}
let config;
try {
config = yaml.parse(configData);
} catch (error) {
logger.error('Failed to read config, invalid yaml syntax.')
return -1;
}
let proxies = {};
for (let onvifConfig of config.onvif) {
let server = onvifServer.createServer(onvifConfig, logger);
if (server.getHostname()) {
logger.info(`Starting virtual onvif server for ${onvifConfig.name} on ${server.getHostname()}:${onvifConfig.ports.server} ...`);
server.startServer();
server.startDiscovery();
if (args.debug)
server.enableDebugOutput();
logger.info(' Started!');
logger.info('');
if (!proxies[onvifConfig.target.hostname])
proxies[onvifConfig.target.hostname] = {}
if (onvifConfig.ports.rtsp && onvifConfig.target.ports.rtsp)
proxies[onvifConfig.target.hostname][onvifConfig.ports.rtsp] = onvifConfig.target.ports.rtsp;
if (onvifConfig.ports.snapshot && onvifConfig.target.ports.snapshot)
proxies[onvifConfig.target.hostname][onvifConfig.ports.snapshot] = onvifConfig.target.ports.snapshot;
} else {
logger.error(`Failed to find IP address for MAC address ${onvifConfig.mac}`)
return -1;
}
}
for (let destinationAddress in proxies) {
for (let sourcePort in proxies[destinationAddress]) {
logger.info(`Starting tcp proxy from port ${sourcePort} to ${destinationAddress}:${proxies[destinationAddress][sourcePort]} ...`);
tcpProxy.createProxy(sourcePort, destinationAddress, proxies[destinationAddress][sourcePort]);
logger.info(' Started!');
logger.info('');
}
}
} else {
logger.error('Please specifiy a config filename!');
return -1;
}
return 0;
}